首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenWRT的CMake/Linker交叉编译

OpenWRT的CMake/Linker交叉编译
EN

Stack Overflow用户
提问于 2016-04-30 17:47:55
回答 1查看 1.8K关注 0票数 0

不幸的是,由于链接问题,我暂停了在OpenWRT下移植我的一个软件,但为了深入了解上面的问题,我需要简要地向您介绍一下我的软件的一些细节。

它由三个模块组成: LIB-1、LIB-2和APP.

我正在用Netbeans/C++和CMake在CMake下开发它。我是由CMake交叉编译的(我成功地遵循了本指南file),我已经通过最新的官方BUILDROOT工具构建了一个工具链和一个目标泛型-x86 OpenWRT映像(它在VirtualBox下像一个魅力一样工作)。

我将CMAKE_LIBRARY_OUTPUT_DIRECTORY和CMAKE_RUNTIME_OUTPUT_DIRECTORY设置为公用文件夹(${CMAKE_BINARY_DIR}/bin),以便将所有二进制文件都放在同一个文件夹中。

现在,我为LUbuntu构建了这个项目,并在ouput文件夹中找到了LIB-1.so、LIB-2.so和APP,就像预期的那样。然后我在应用程序上执行'ldd‘,我看到它引用了LIB-1.so和LIB-2.so,就像预期的那样。通过冗长的CMake输出,我还可以看到CMake设置(如预期的) RPATH,它指向'${CMAKE_BINARY_DIR}/bin‘。

现在开始讨论问题的细节..。

我为OpenWRT构建了这个项目,并在输出文件夹中找到了所有的三个文件,就像预期的那样。然后我执行'ldd‘和'objdump -x’,我看到该应用程序链接到‘./bin/lib-1.so’和‘./bin/lib-2.so’(文件名加上一个相对路径前缀!!)。另一个区别是CMake (我不知道为什么)没有在链接命令行中添加RPATH!

为了在没有相对“./bin”路径的情况下获得链接到两个库的应用程序,我必须将这两个SO文件放在应用链接文件夹中,并手动运行链接器,去掉‘./bin/’前缀,并添加'-Wl,-rpath,${CMAKE_BINARY_DIR}/bin‘。

有谁能解释我:

1)为什么CMake使用不同的命令行参数链接这两个平台?

2)如何与CMake连接,嵌入相对.SO路径?

3)如果没有一个读者使用CMake,有人能告诉我G++链接器是否存在一个额外的参数来从引用的LIB中删除相对路径吗?

非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2016-05-02 06:47:16

暂时我找到了一个解决办法。

我创建了一个类似于这个(openwrt-fix-libs):的bash脚本

代码语言:javascript
复制
#!/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文件中:

代码语言:javascript
复制
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")

当我为_GLOBAL_SCRIPTS_DIR编译时,_PLATFORM是我在命令行上设置的符号,_GLOBAL_OUTPUT_DIR是项目脚本文件夹,然后是CMake构建根目录中的bin

我希望这对你也有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36958201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档