CMake交叉编译目标rpath

时间:2015-05-22 15:17:30

标签: cmake cross-compiling rpath

我正在使用CMake进行交叉编译。

在我的CMakeLists.txt中(用于编译和交叉编译):

set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
find_package(foo REQUIRED)
add_library(mylib SHARED ${SRCS})
target_link_libraries(mylib ${FOO_LIBRARIES)

在我的toolchain.cmake中:

set(CMAKE_CXX_FLAGS "... --sysroot=/path/to/sysroot/ ... ")
set(CMAKE_CXX_LINK_FLAGS "... --sysroot=/path/to/sysroot/ ... )
...
set(CMAKE_FIND_ROOT_PATH /path/to/sysroot)

当我交叉编译 foo 位于 /path/to/sysroot/usr/local/lib/foo.so > mylib 是 / path / to / sysroot / usr / local / lib

我希望运行时路径是 / usr / local / lib 以反映我的目标文件系统。

如果不在我的CMakelists.txt中定义硬编码的 CMAKE_INSTALL_RPATH 变量,我怎么能这样做?

编辑:我使用/ usr / local / lib作为示例,但 foo lib位于不属于系统目录的特定文件夹中:/ path / to / sysroot / usr /local/share/mypackage/lib/foo.so

2 个答案:

答案 0 :(得分:1)

查看CMake RPATH handling上的wiki。

默认情况下,CMake使用指向主机系统库位置(/crosssdk/sysroot/usr/lib/)的RPATH编译可执行文件,然后(我相信)安装时(即。make install)它编辑RPATH in用适当的目标RPATH(/usr/lib或任何你得到的)替换它的可执行文件。我认为这样的想法是,您可以对共享库进行更改并在主机系统上执行输出,而无需每次都安装共享库和可执行文件。 在我的情况下,我的主机是x86,目标是ARM,所以我告诉CMake将构建RPATH设置为与安装RPATH相同:

set_target_properties(mytarget PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE)

答案 1 :(得分:0)

我不确定您使用的是哪个交叉编译工具链。

您需要指定C / CXX编译器,链接器等。 除此之外,一些重要的变量是CMAKE_FIND_ROOT_PATH_MODE_LIBRARY和CMAKE_FIND_ROOT_PATH_MODE_INCLUDE。如果将它们设置为“ONLY”,则在调用FindXXX()时,搜索仅在目标根文件系统目录中发生,而不在构建计算机上发生。

在我的情况下,我不必指定sysroot,因为交叉编译器已经知道它是交叉编译的,它也知道目标根文件系统的位置。

使用这个工具链文件,我只是在没有任何额外标志的情况下编译源代码,在目标上加载可执行文件,它可以直接从正确的路径运行* .so文件。

尝试一下,让我知道它是怎么回事。

这是我的工具链文件:

POST / HTTP/1.1\r\nHost: 192.168.2.4:8000\r\nReferer: http://192.168.2.4:8000/\r\nContent-Type: application/x-www-form-urlencoded\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: nl-nl\r\nAccept-Encoding: gzip, deflate\r\nOrigin: http://192.168.2.4:8000\r\nContent-Length: 10\r\nConnection: keep-alive\r\nUser-Agent: Mozilla/5.0 (iPad; CPU OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53\r\n\r\n