毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> linux >> 正文

linux下c程序如何包含头文件

更新时间:2012-10-7:  来源:毕业论文

刚学linux下的c编程,写了一个简单的程序,如下:
#include <stdio.h>
#include <math.h>
int main()
{
int i;
for(i=0;i<10;i++)
{
printf("%f\n",sin(i));
}
}
编译时如下:
# cc first.c
出现如下提示:
first.o(.text+0x30):In function 'main';
: undefined reference to 'sin'
collect2: Id returned 1 exit status
不知道这是为什么,他提示说没有包含数学库文件,但是我程序里
已经有#include <math.h>,为何不行呢?
如果编译时用 #cc first.c -lm 就可以.
如果包含的文件都得在编译行里面加进去,那代码行里面的include有什么用呢?
 请各位高手指点一下,忙了几天也没弄明白.
lm是共享库.类似于windows的静态库或者动态链接库
 
#include <math.h>
math.h有sin函数的声明. sin函数的代码在libm.so/libm.a里. 链接时需要sin函数的代码所以要加-lm
一个不恰当的比喻. math.h就象你们公司的程序员名单. libm.a/libm.so就像公司的程序员们.
在做软件开发计划的时候看名单就可以了,真正开发软件的时候就需要程序员了.
C标准库的函数,类型和宏标准头文件里声明:
  <assert.h> <float.h> <math.h> <stdarg.h> <stdlib.h>
  <ctype.h> <limits.h> <setjmp.h> <stddef.h> <string.h>
  <errno.h> <locale.h> <signal.h> <stdio.h> <time.h>

使用math.h里的函数需要-lm, 其他的函数需要-lc.
用gcc编译和链接时,到了链接阶段gcc会加上-lc参数取调用ld(链接编辑程序).
可以传--verbose参数给ld查看链接的详细步骤.
gcc -Wl,--verbose -o hello hello.c
GNU ld version 2.15 [FreeBSD] 2004-05-23
  Supported emulations:
  elf_i386_fbsd
  elf_x86_64_fbsd
using internal linker script:
==================================================
/* Script for -z combreloc: combine and sort reloc sections */
OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64",
  "elf64-x86-64")
OUTPUT_ARCH(i386:x86-64)
ENTRY(_start)
SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib");
/* Do we need any of these for elf?
  __DYNAMIC = 0; */
SECTIONS
{
  /* Read-only sections, merged into text segment: */
  PROVIDE (__executable_start = 0x400000); . = 0x400000 + SIZEOF_HEADERS;
  .interp : { *(.interp) }
  .hash : { *(.hash) }
  .dynsym : { *(.dynsym) }
  .dynstr : { *(.dynst

[1] [2] [3] [4] [5] 下一页

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。