1

我创建了 .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

*

可能是什么问题呢?(感谢您的光临:))

4

1 回答 1

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 发行版提供,因此只需使用包管理器安装它(它尚未安装),并阅读有关它的快速教程。

于 2013-07-28T21:32:24.583 回答