2014-04-23 36 views
1

使用標誌「-Wl, - no-undefined -Wl, - no-allow-shlib -undefined」與GCC導致特拉維斯CI形象以下編譯錯誤,但不是我的機器上(都是Ubuntu的12.04 64位):將錯誤鏈接到「-Wl, - no-undefined -Wl, - no-allow-shlib-undefined」

Linking CXX shared library libmocap.so 
cd /tmp/_travis/build/src && /usr/bin/cmake -E cmake_link_script CMakeFiles/mocap.dir/link.txt --verbose=1 
/usr/bin/g++ -fPIC --coverage -Werror -pedantic -Wno-long-long -Wall -Wextra -Wcast-align -Wcast-qual -Wformat -Wwrite-strings -Wconversion -fvisibility=hidden -Wl,--no-undefined -Wl,--no-allow-shlib-undefined -Wl,--as-needed -shared -Wl,-soname,libmocap.so.0.0.0 -o libmocap.so.UNKNOWN CMakeFiles/mocap.dir/abstract-marker.cc.o CMakeFiles/mocap.dir/abstract-virtual-marker.cc.o CMakeFiles/mocap.dir/color.cc.o CMakeFiles/mocap.dir/link.cc.o CMakeFiles/mocap.dir/marker-set-factory.cc.o CMakeFiles/mocap.dir/marker-set.cc.o CMakeFiles/mocap.dir/marker-trajectory-factory.cc.o CMakeFiles/mocap.dir/marker-trajectory.cc.o CMakeFiles/mocap.dir/marker.cc.o CMakeFiles/mocap.dir/mars-marker-set-factory.cc.o CMakeFiles/mocap.dir/math.cc.o CMakeFiles/mocap.dir/pose.cc.o CMakeFiles/mocap.dir/segment.cc.o CMakeFiles/mocap.dir/string.cc.o CMakeFiles/mocap.dir/trc-marker-trajectory-factory.cc.o CMakeFiles/mocap.dir/virtual-marker-one-point-measured.cc.o CMakeFiles/mocap.dir/virtual-marker-relative-to-bone.cc.o CMakeFiles/mocap.dir/virtual-marker-three-points-measured.cc.o CMakeFiles/mocap.dir/virtual-marker-three-points-ratio.cc.o CMakeFiles/mocap.dir/virtual-marker-two-points-measured.cc.o CMakeFiles/mocap.dir/virtual-marker-two-points-ratio.cc.o 
/lib/x86_64-linux-gnu/libc.so.6: undefined reference to `[email protected]_PRIVATE' 
/lib/x86_64-linux-gnu/libc.so.6: undefined reference to `[email protected]_PRIVATE' 
/usr/lib/gcc/x86_64-linux-gnu/4.6/libstdc++.so: undefined reference to `[email protected]_2.3' 
/lib/x86_64-linux-gnu/libc.so.6: undefined reference to `[email protected]_PRIVATE' 
/lib/x86_64-linux-gnu/libc.so.6: undefined reference to `[email protected]_PRIVATE' 
collect2: ld returned 1 exit status 
make[2]: *** [src/libmocap.so.UNKNOWN] Error 1 

奇怪的是,這並不在我的機器上出現,因此是有點難以重現。 啓用這些標誌時,鏈接到libc和libstdC++的正確方法是什麼?

(正如你可能從輸出猜,我用CMake的生成編譯命令)

回答

2

的第二個參數的默認值是「--allow-SHLIB-未定義」。 也許如果您選擇代碼將構建的選項。

這第二個參數處理構建時檢查在哪裏啓用這意味着檢查您鏈接的庫依次在構建時將其依賴關係連接起來。並非如此。

第一個參數確保您沒有忘記聲明運行時庫的依賴關係(也可能是運行時庫對另一個運行時庫有依賴關係)。例如,如果您正在調用函數,實現在一個示例運行時庫「libfunc.so」中,並且該庫反過來將調用另一個運行時庫「libext.so」中的函數,然後通過聲明對「func」和「ext」的依賴關係,libfunc.so將會生成以在內部包含對libext的依賴引用。 如果你忽略了「--no undefined」並忘記添加依賴聲明,那麼構建仍然會成功,相信你的運行時鏈接器可以在運行時解決依賴關係。而且由於構建成功,您可能會相信一切都會好起來的,因爲不知道構建將責任推遲到運行時鏈接程序。但大多數情況下,運行時鏈接程序不是用來搜索未解析的引用,而是希望找到運行時庫中聲明的這種依賴關係。如果沒有這樣的參考,你會得到一個運行時錯誤。運行時錯誤通常比解決編譯時錯誤要昂貴得多。

+0

在這種情況下是否有用於「--no-allow-shlib-undefined」標誌?根據我的理解,只要你是libC++,你將無法編譯這個標誌,對吧? –

相關問題