与ld / gcc链接不会产生相同的结果(错误/成功)

时间:2014-04-14 13:38:39

标签: c linux gcc linker ld

我有一个问题,编译后我不想用ld链接但是当我这样做时我得到一个错误让我看看我做了什么:

make i386
gcc -g -c -I. -I/usr/include -o p_test.o.i386 pkcs11test.c
ld -o p_test.i386 p_test.o.i386 -g -ldl     
ld: p_test.o.i386: référence au symbole non défini «fflush@@GLIBC_2.0»
//lib/i386-linux-gnu/libc.so.6: error adding symbols: DSO missing from command line
make: *** [i386_p_test] Erreur 1

所以使用ld我得到了这个错误但是当我尝试使用gcc时

make i386
gcc -g -c -I. -I/usr/include -o p_test.o.i386 pkcs11test.c
gcc -o p_test.i386 p_test.o.i386 -g -ldl

我没有错误和我的可执行文件

你知道如何让ld与我的程序联系起来吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

当您使用gcc -o p_test.i386 p_test.o.i386 -g -ldl启动gcc时,它实际上会向ld命令添加许多内部库。您可以通过向gcc添加-v选项来查看所有参数。其中一个内部库"是glibc本身(-lc)。

例如,在这里GCC verbose mode output explanation,我们可以看到用于链接可执行文件的collect2程序。运行中添加了-lgcc -lgcc_eh -lc -lgcc -lgcc_eh个库,并且链接了几个CRT运行时对象:

/usr/lib/gcc-lib/i686/3.3.1/collect2
 --eh-frame-hdr -m elf_i386 -dynamic-linker
 /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o
 /usr/lib/gcc-lib/i686/3.3.1/crtbegin.o
 -L/usr/lib/gcc-lib/i686/3.3.1
 -L/usr/lib/gcc-lib/i686/3.3.1/../../..
  /tmp/ccQynbTm.o  # << this is input file.
 -lgcc -lgcc_eh -lc -lgcc -lgcc_eh
 /usr/lib/gcc-lib/i686/3.3.1/crtend.o
 /usr/lib/crtn.o

PS:我认为最好不要更改文件扩展名(后缀)。您的p_test.o.i386可以重命名为p_test.i386.o