QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1066|回复: 14

Libraries

[复制链接]
发表于 2005-1-19 00:25:27 | 显示全部楼层 |阅读模式
一段显示sin和cos图形的 [code:1]
#include <stdio.h>

#include <math.h>

int main(){

        double x;

        int i,n1,n2,a,b;

        for(x=0;x<20;x=0.25+x)

        {

                n1=(int)(20+20*sin(x));

                n2=(int)(20+20*cos(x));

                if(n1<n2)

                {a=n1;b=n2-n1;}

                else{a=n2;b=n1-n2;}

                for(i=0;i<a;i++)putchar(' ');

                printf("*");

                for(i=0;i<b;i++)putchar(' ');

                printf("*\n");

        }
        return 0;

}
[/code:1]
在TC下通过, 而在我的linux 下用gcc编译确出现错误[code:1]
gcc -o sin_graph sin_graph.c
/tmp/ccu693FQ.o(.text+0x41): In function `main':
: undefined reference to `sin'
/tmp/ccu693FQ.o(.text+0x78): In function `main':
: undefined reference to `cos'
collect2: ld returned 1 exit status
[/code:1]
是什么原因导致这样的错误呢?
发表于 2005-1-19 00:46:37 | 显示全部楼层
gcc xxx.c -o xxx -lm
因为sin和cos是数学函数,所以要用到数学函数库
回复

使用道具 举报

 楼主| 发表于 2005-1-19 10:01:38 | 显示全部楼层
谢谢.   
再问一句,如果我不知道数学函数库的参数是 -lm , 应该怎么查找呢?
回复

使用道具 举报

发表于 2005-1-19 11:01:27 | 显示全部楼层
mozilla真是辛苦。。。
回复

使用道具 举报

发表于 2005-1-19 18:43:00 | 显示全部楼层
linux c编程的书有介绍的啊
回复

使用道具 举报

发表于 2005-1-19 18:55:07 | 显示全部楼层
看一下glibc的介绍,我也不知道,只能这么说
回复

使用道具 举报

 楼主| 发表于 2005-1-24 19:19:15 | 显示全部楼层
看了一些文章,终于明白了-lm是连接/usr/lib/libm.so的选项.
但是去掉了#include <math.h>编译也正常, 那既然有了 libm.so和libm.a 还要头文件math.h干什么呢?
-----------
另外, 如果在/usr/include里有一个头文件hello.h, 包含了程序所引用函数的全部代码, 是否只需#include <hello.h>而编译的命令中不用加选项就行?
-------------
我是菜嘛,不要
回复

使用道具 举报

发表于 2005-1-24 19:32:14 | 显示全部楼层
[quote:1dbabed8a4="neptune"]看了一些文章,终于明白了-lm是连接/usr/lib/libm.so的选项.
但是去掉了#include <math.h>编译也正常, 那既然有了 libm.so和libm.a 还要头文件math.h干什么呢?
-----------
另外, 如果在/usr/include里有一个头文件hello.h, 包含了程序所引用函数的全部代码, 是否只需#include <hello.h>而编译的命令中不用加选项就行?
-------------
我是菜嘛,不要 [/quote]头文件作用是c/c++的基本问题,楼主应该找本教程好好学学啊
回复

使用道具 举报

 楼主| 发表于 2005-1-24 20:36:20 | 显示全部楼层
回复

使用道具 举报

发表于 2005-1-24 23:04:01 | 显示全部楼层
另外, 如果在/usr/include里有一个头文件hello.h, 包含了程序所引用函数的全部代码, 是否只需#include <hello.h>而编译的命令中不用加选项就行?

这个貌似不行…… 还的老老实实加上
加上了很多库很有成就感阿
看着make 的时候
不断的刷屏,太爽了
回复

使用道具 举报

 楼主| 发表于 2005-1-25 12:02:02 | 显示全部楼层
(楼上的说到我心里面啊! 当我第一编译安装gnome时, 看到满屏闪动的编译选项就觉得很迷惑.  上面那个hello.h的问题是我假设出来的, 也许根本不存在这样的情况.  我问得这样隐晦想不到还是被板主一语道破... )
先前我想找几个ascii函数的源代码, 在头文件里搜索只找到一堆define和ifdef,连函数原型都没见到(比如math.h里只有sine而找不到sin().后来才知道那些函数的代码都在静态动态连接库中.
我们教材讲的是TC, 书上没有详细说头文件, 只给了我一个模糊的印象(要调用这些函数,就要include头文件.)反正教材上除了dos的东西外都刨过了, 而冲斥书店的是vc教程, 像C primer plus这样的好书(我怀疑我们校区的图书管只有1~2本), 只有幸看过几眼, 没有借的机会...
所以,还是请不吝赐教
回复

使用道具 举报

发表于 2005-2-2 17:54:34 | 显示全部楼层
直接man sin或者man cos就可以找到这些函数对应的头文件和库文件名了
回复

使用道具 举报

发表于 2005-2-2 20:27:17 | 显示全部楼层
[quote:2e37b62bf3="neptune"]看了一些文章,终于明白了-lm是连接/usr/lib/libm.so的选项.
但是去掉了#include <math.h>编译也正常, 那既然有了 libm.so和libm.a 还要头文件math.h干什么呢?
-----------
另外, 如果在/usr/include里有一个头文件hello.h, 包含了程序所引用函数的全部代码, 是否只需#include <hello.h>而编译的命令中不用加选项就行?
-------------
我是菜嘛,不要 [/quote]你加上 -Wall 编译选项就可以知道你不用加<math.h>是因为编译器自动为你加上了,但还是会警告你。
如果你的任何一个头文件包括了所有要使用的函数的实现,那就不要什么库了。所以你包含<hello.h>就可以了不用选项。
头文件的作用是给出一个函数原型及一些其它如宏等,主要是让编译器知道这个函数的特征。可以看看c语言的书。
回复

使用道具 举报

 楼主| 发表于 2005-2-2 21:09:58 | 显示全部楼层
太...太感谢了. -Wall的作用还是头一回听说, 小弟一定努力看书看文章
回复

使用道具 举报

发表于 2005-2-2 21:22:40 | 显示全部楼层
[quote:af50099f9c="neptune"]太...太感谢了. -Wall的作用还是头一回听说, 小弟一定努力看书看文章[/quote]对不起, -Wall并不会告诉你有些库编译器会为你自动加。只是它会警告你没有明确声明。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-6 16:43 , Processed in 0.052904 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表