2013-01-15 49 views
9

我編譯稱爲「詢問」的可執行文件後:缺少LDD庫使用gcc -l

 
g++ -o built/bin/interrogate -Lbuilt/lib -Lbuilt/tmp -L/usr/X11R6/lib \ 
built/tmp/interrogate_composite1.o built/tmp/interrogate_composite2.o \ 
-lp3cppParser -lp3dtool -lp3dtoolconfig -lp3pystub -pthread -ldl 

編譯後,當我嘗試執行可執行文件:

 
$ LD_LIBRARY_PATH=built/lib built/bin/interrogate 
built/bin/interrogate: symbol lookup error: built/lib/libp3dtool.so.1.8: undefined symbol: _Py_NoneStruct 

這個符號是由libp3pystub.so提供,但詰可執行文件不具有此庫的任何引用(我用的-lp3pystub):

 
$ LD_LIBRARY_PATH=built/lib ldd built/bin/interrogate 
    linux-vdso.so.1 => (0x00007fff2016a000) 
    libp3dtool.so.1.8 => built/lib/libp3dtool.so.1.8 (0x00007f498d57a000) 
    libp3dtoolconfig.so.1.8 => built/lib/libp3dtoolconfig.so.1.8 (0x00007f498d51b000) 
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f498d1f2000) 
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f498cfdc000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f498cdbf000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f498c9ff000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f498c7fb000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f498c4ff000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f498d5bc000) 

如果我手動加載libp3pystub.so,可執行的工作原理:

 
$ LD_PRELOAD=built/lib/libp3pystub.so LD_LIBRARY_PATH=built/lib built/bin/interrogate 

Usage: 
    interrogate [opts] file.C [file.C ...] 
    interrogate -h 

我的問題是:爲什麼我和-lp3pystub添加庫沒有被interrogate可執行文件引用?

回答

10

我其實自己找到答案。我在Ubuntu上編譯,他們添加了一個默認優化標誌:-Wl,--as-needed。如果在主可執行文件中使用-l傳遞的庫中沒有符號,則此優化檢查將被刪除。

這就是我的錯誤所在:_Py_NoneStruct不是直接被詢問使用,而是被另一個共享庫使用。所以我必須手動指定需要使用p3pystub。

一個可能的解決將是:

 
$ g++ -o built/bin/interrogate -Lbuilt/lib -Lbuilt/tmp -L/usr/X11R6/lib \ 
built/tmp/interrogate_composite1.o built/tmp/interrogate_composite2.o \ 
-Wl,--no-as-needed -lp3cppParser -lp3dtool -lp3dtoolconfig -lp3pystub \ 
-pthread -ldl 

然後我得到了正確的LDD輸出庫:

$ LD_LIBRARY_PATH=built/lib ldd built/bin/interrogate 
    linux-vdso.so.1 => (0x00007fff0edff000) 
    libp3dtool.so.1.8 => built/lib/libp3dtool.so.1.8 (0x00007fa1c36be000) 
    libp3dtoolconfig.so.1.8 => built/lib/libp3dtoolconfig.so.1.8 (0x00007fa1c365f000) 
>>> libp3pystub.so.1.8 => built/lib/libp3pystub.so.1.8 (0x00007fa1c3658000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa1c342f000) 
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa1c312c000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa1c2e2f000) 
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa1c2c19000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa1c29fc000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa1c263c000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007fa1c3700000) 

參考: https://wiki.ubuntu.com/NattyNarwhal/ToolchainTransition