我创建了.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
*
可能是什么问题? (感谢您停下来:))
答案 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发行版提供,因此只需将其与软件包管理器一起安装(它尚未安装),并阅读它的快速教程。