从使用多个.c文件生成的.o文件创建.so文件时出错

时间:2013-07-28 21:11:06

标签: c atmel libusb-1.0

我创建了.o文件,如下所示,

*gcc -I/home/vineeshvs/Dropbox/wel/workspace/Atmel -I /home/vineeshvs/Downloads/libusb-1.0.9 -I /home/vineeshvs/Downloads/libusb-1.0.9/libusb/ usb_comm.c hex2bin.c hex_read.c crc32.c -o vs.o -lusb-1.0*

然后我使用以下命令获取.so文件

*gcc vs.o -shared  -o libhello.so*

然后我收到如下错误

*vs.o: In function `__i686.get_pc_thunk.bx':

(.text+0xaa6): multiple definition of `__i686.get_pc_thunk.bx'
/usr/lib/gcc/i686-linux-gnu/4.6/crtbeginS.o:crtstuff.c:

(.text.__i686.get_pc_thunk.bx[__i686.get_pc_thunk.bx]+0x0): first defined here
vs.o: In function `_fini':

(.fini+0x0): multiple definition of `_fini'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crti.o:(.fini+0x0): first defined here
vs.o: In function `__data_start':

(.data+0x4): multiple definition of `__dso_handle'
/usr/lib/gcc/i686-linux-gnu/4.6/crtbeginS.o:(.data.rel+0x0): first defined here
vs.o: In function `_init':

(.init+0x0): multiple definition of `_init'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crti.o:(.init+0x0): first defined here
/usr/lib/gcc/i686-linux-gnu/4.6/crtendS.o:(.dtors+0x0): multiple definition of `__DTOR_END__'
vs.o:(.dtors+0x4): first defined here
/usr/bin/ld.bfd.real: error in vs.o(.eh_frame); no .eh_frame_hdr table will be created.

collect2: ld returned 1 exit status

*

可能是什么问题? (感谢您停下来:))

1 个答案:

答案 0 :(得分:2)

问题在于您要链接目标文件,而不仅仅是编译它们。

确保编译文件,不要链接它们!您可以使用-c选项执行此操作。不要使用-l选项,您不希望在此阶段链接任何内容。所以:

gcc -c -o usb_comm.o usb_comm.c
gcc -c -o hex2bin.o hex2bin.c
gcc -c -o hex_read.o hex_read.c
gcc -c -o crc32.o crc32.c

(我省略了-I标志以节省空间。)

然后最后将所有这些目标文件链接到一个共享库,并链接到usb-1.0:

gcc -shared -o libhello.so usb_comm.o hex2bin.o hex_read.o crc32.o -lusb-1.0

你应该为此使用Makefile。或者,更好的是,使用适当的构建系统,如CMake,这非常容易使用。它由所有常见的Linux发行版提供,因此只需将其与软件包管理器一起安装(它尚未安装),并阅读它的快速教程。