【发布时间】:2016-08-25 18:53:53
【问题描述】:
很遗憾,由于链接问题,我暂停了在 OpenWRT 下移植我的软件,但为了更深入地了解上述问题,我需要简要介绍一下我的软件的一些细节。
它由三个模块组成:LIB-1、LIB-2和APP。
我正在使用 Netbeans/C++ 和 CMake 在 LUbuntu 下开发它。我正在通过 CMake 进行交叉编译(我成功地遵循了本指南 http://www.vtk.org/Wiki/CMake_Cross_Com … chain_file),并且我已经通过最新的官方 BUILDROOT 工具构建了一个工具链和一个目标 Generic-x86 OpenWRT 映像(它在 VirtualBox 下工作就像一个魅力)。
我将 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 避免嵌入相对 .SO 路径?
3) 如果没有读者使用 CMake,有人可以告诉我是否存在用于 G++ 链接器的附加参数以从引用的 LIB 中去除相对路径?
非常感谢!
【问题讨论】:
标签: c++ linux gcc cmake openwrt