2011-10-28 50 views
14

我編譯一些共享對象文件轉化成archive.a鏈接歸檔(.a)中成共享對象(的.so)

$ g++ -c -Iinclude/ -fPIC -O0 -o object1.o source1.cpp 
$ g++ -c -Iinclude/ -fPIC -O0 -o object2.o source2.cpp 
$ ar rvs archive.a object1.o object2.o 
r - object1.o 
r - object2.o 

到目前爲止好。由此產生的archive.a具有一定的KB大小。與nm轉儲顯示相應的對象文件包含在文件中。

現在我想將這些檔案中的幾個編譯成共享對象文件。

g++ -g -O0 -Iinclude/ -I/usr/include/somelibrary -shared -o libLibrary.so archive1.a archive2.a 

結果是我得到的庫文件是近

$ nm -D libLibrary.so 
       w _Jv_RegisterClasses 
0000000000201010 A __bss_start 
       w __cxa_finalize 
       w __gmon_start__ 
0000000000201010 A _edata 
0000000000201020 A _end 
0000000000000578 T _fini 
0000000000000430 T _init 

任何想法,我做錯了嗎?


編輯:

當我嘗試開關-Wl,--whole-archive,以下情況發生:

/usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init': 
(.text+0xd): undefined reference to `__init_array_end' 
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS): relocation R_X86_64_PC32 against undefined hidden symbol `__init_array_end' can not be used when making a shared object 
/usr/bin/ld: final link failed: Bad value 
collect2: ld returned 1 exit status 
make: *** [libKeynect.so] Error 1 
+0

[如何將共享對象中的所有對象歸檔?](http://stackoverflow.com/questions/2763988/how-to-include-all-objects-of-an-archive- in-a-shared-object) – Atmocreations

回答

15

符號/在並非使用.a文件的目標文件,將被鏈接器丟棄。

使用-Wl,--whole-archive用於鏈接到包括整個某文件 編輯,你需要添加-Wl,--no-whole-archive您指定的庫後爲好,這樣整個事情會-Wl,--whole-archive archive1.a archive2.a -Wl,--no-whole-archive

+0

感謝您的快速回復。不幸的是,我似乎遇到了另一個問題。我修改了這個問題。 – Atmocreations

4

關於您的編輯:將「-Wl, - no-whole-archive」在你正在運行的鏈接命令的末尾。這爲我修好了。