可惜我已暫停的OpenWRT礦井下的軟件移植由於連接問題,但爲了更深入上述問題,我需要簡單給大家介紹我的軟件的一些細節。的CMake /連接器交叉編譯的OpenWRT
它是由三個模塊:LIB-1,LIB-2和APP。
我正在用Netbeans/C++和CMake在LUbuntu下開發它。我正在通過CMake進行交叉編譯(我成功地遵循了本指南http://www.vtk.org/Wiki/CMake_Cross_Com … chain_file),並且我已經使用最新的官方BUILDROOT工具(它可以像VirtualBox一樣在VirtualBox下工作)構建了一個工具鏈和一個目標Generic-x86 OpenWRT圖像。
我將CMAKE_LIBRARY_OUTPUT_DIRECTORY和CMAKE_RUNTIME_OUTPUT_DIRECTORY設置爲一個公用文件夾($ {CMAKE_BINARY_DIR}/bin),以便將所有二進制文件放入同一個文件夾中。
現在,我建項目LUbuntu和輸出中的文件夾裏面,我覺得LIB-1.so,LIB-2.so和APP,符合市場預期。然後我在APP上執行'ldd',我發現它按照預期引用了LIB-1.so和LIB-2.so。通過詳細的CMake輸出,我還看到CMake設置了(如預期的)指向'$ {CMAKE_BINARY_DIR}/bin'的RPATH。
現在進入問題的詳細信息...
我建項目的OpenWRT,我覺得所有的三個文件的輸出文件夾內,符合市場預期。然後我執行'ldd'和'objdump -x',我看到APP鏈接到'../bin/LIB-1.so'和'../bin/LIB-2.so'(文件名加上一個相對路徑前綴!!!)。另一個區別是CMake(我不知道爲什麼)不會在鏈接命令行上添加RPATH!
爲了得到APP連接到兩個庫,而不相對「../bin'路,我不得不把兩個SO文件APP鏈接文件夾內,並手動運行鏈接剝離」 ../ bin /'前綴,並添加'-Wl,-rpath,$ {CMAKE_BINARY_DIR}/bin'。
可能有人給我解釋一下:
1)爲什麼CMake的鏈接使用不同的命令行參數的兩個平臺?
2)我如何通過CMake鏈接avoind嵌入相對.SO路徑?
3)如果沒有任何讀者使用CMake的,可能有人如果存在用於G ++鏈接器從引用的LIBS剝離相對路徑的附加參數告訴我嗎?
非常感謝!