2016-04-30 146 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建设根。

我希望它也许对你有用。