2016-04-30 80 views
0

可惜我已暫停的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剝離相對路徑的附加參數告訴我嗎?

非常感謝!

回答

0

目前我找到了解決方法。

我創建這樣一個bash腳本(的OpenWrt-FIX-庫):

#!/bin/bash 

TARGET_NAME=$1 
OUTPUT_DIR=$2 

# Prologue 

ECHO_PREFIX=[----] 
echo "$ECHO_PREFIX Fixing OpenWRT library imports for \"$TARGET_NAME\"..." 

# Dependencies copy 

echo "$ECHO_PREFIX Copying libraries locally from \"$OUTPUT_DIR\"..."; 
cp $OUTPUT_DIR/*.so . 

if [ $? != 0 ]; then 
    exit 1 
fi 

# Link command hacking 

LINK_COMMAND=./CMakeFiles/$TARGET_NAME.dir/link.txt 
echo "$ECHO_PREFIX Hacking link command at \"$LINK_COMMAND\"..." 

LINK_COMMAND=$(cat $LINK_COMMAND | sed -e 's/\.\.\/bin\///g') 
#echo "$ECHO_PREFIX <$LINK_COMMAND>" 

if [ $? != 0 ]; then 
    exit 1 
fi 

# Re-linking 

echo "$ECHO_PREFIX Re-linking..."; 

$LINK_COMMAND 

if [ $? != 0 ]; then 
    exit 1 
fi 

# Update rebuilt binary 

echo "$ECHO_PREFIX Updating \"$TARGET_NAME\" binary..." 
cp *$TARGET_NAME* ${OUTPUT_DIR} 

if [ $? != 0 ]; then 
    exit 1 
fi 

# Epilogue 

echo "$ECHO_PREFIX Libraries imports successfully fixed." 

然後我加入到CMakeLists。任何模塊的txt文件,我需要這樣的自定義命令:

if (_PLATFORM STREQUAL "OPENWRT") 

    add_custom_command(
    TARGET    ${_TARGET_NAME} 
    POST_BUILD COMMAND ${_GLOBAL_SCRIPTS_DIR}/openwrt-fix-libs ${_TARGET_NAME} ${_GLOBAL_OUTPUT_DIR} 
) 

endif (_PLATFORM STREQUAL "OPENWRT") 

_PLATFORM是我在命令行設置,當我編譯的OpenWRT的象徵,_GLOBAL_SCRIPTS_DIR是我的項目的腳本文件夾,_GLOBAL_OUTPUT_DIR然後裏面的CMake建設根。

我希望它也許對你有用。