首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >交叉编译时,link.txt of CMake中的链接器命令应该是什么?

交叉编译时,link.txt of CMake中的链接器命令应该是什么?
EN

Stack Overflow用户
提问于 2016-11-08 22:04:04
回答 1查看 5.2K关注 0票数 1

我正在Ubuntu16.04 x86_64 box上尝试交叉编译arm gnueabihf。我在toolchain.cmake文件中使用Cmake,其中可能声明了所有重要的内容如下:

代码语言:javascript
复制
set(CMAKE_C_COMPILER "/usr/bin/arm-linux-gnueabihf-gcc")
set(CMAKE_CXX_COMPILER "/usr/bin/arm-linux-gnueabihf-g++")
set(CMAKE_FIND_ROOT_PATH "/usr/arm-linux-gnueabihf")

它似乎产生了我所需要的一切。但是当链接可执行目标时,make失败了。在那里窥探,我发现在link.txt in <target>.dir中,我有g++命令。我希望有像arm-linux-gnueabihf-g++这样的跨工具链的编译器。

查看其他link.txt中的其他<target>,它不是可执行的,而是静态库,有来自交叉工具链(如/usr/bin/arm-linux-gnueabihf-ar )的命令。

为什么在可执行目标而不是arm-linux-gnueabihf-g++上只有g++ in link.txt

请帮忙,否则我很快就会生气的..。

添加我的toolchain.cmake文件:

代码语言:javascript
复制
SET(CMAKE_CROSSCOMPILING TRUE)

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR ARMV7)

set(CMAKE_C_COMPILER "/usr/bin/arm-linux-gnueabihf-gcc")
set(CMAKE_CXX_COMPILER "/usr/bin/arm-linux-gnueabihf-g++")

set(CMAKE_C_COMPILER_TARGET "/usr/bin/arm-linux-gnueabihf-gcc")
set(CMAKE_CXX_COMPILER_TARGET "/usr/bin/arm-linux-gnueabihf-g++")

SET(CMAKE_LINKER "/usr/bin/arm-linux-gnueabihf-g++")

# path exists, but not needed to actually compile this
set(CMAKE_FIND_ROOT_PATH "/usr/arm-linux-gnueabihf")

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

SET(OpenBLAS_DIR /root/OpenBLAS/buildArm/lib/cmake/openblas)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-09 08:29:52

检查正确的工具链前缀

通常,CMake会自动确定所需的前缀(并将其存储在内部变量_CMAKE_TOOLCHAIN_PREFIX中)。所以,请反复检查一下,比如:

代码语言:javascript
复制
message(STATUS "_CMAKE_TOOLCHAIN_PREFIX: ${_CMAKE_TOOLCHAIN_PREFIX}")

如果值是正确的,但是有前缀和没有前缀的编译器工具的混合,那么这可能是在工具链文件中尝试/更改东西的结果。请尝试删除您的二进制输出目录,包括CMake变量缓存,包括编译器ids,然后从头开始构建。

检查您的工具链是否包含链接器/生成程序

您确定您的工具链也包含链接器/make程序吗?否则,CMake会尝试寻找替代方案。要检查,可以在PATH调用之前清除cmake变量,或者使用以下方法检查缓存的变量:

代码语言:javascript
复制
message(STATUS "CMAKE_MAKE_PROGRAM: ${CMAKE_MAKE_PROGRAM}")

我建议将Ninja用于不附带自己的make程序的工具链。它是快速,易于使用,没有混淆两个GNU工具链。它只是:

代码语言:javascript
复制
cmake -G "Ninja" -D... 

另见这里

将工具链简化为最简单的形式--

如果它仍然不能工作,则可以使用CMAKE_CXX_COMPILER_TARGET全局变量显式定义工具链文件中编译器的前缀。

尝试构建一个简单的"Hello“程序,其中包含一个非常基本的/简化的工具链文件。

有关示例,请参见例如这里

set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) set(三臂-linux-gnueabihf) set(CMAKE_C_COMPILER gcc) set(CMAKE_C_COMPILER_TARGET ${tri}) set(CMAKE_CXX_COMPILER g++) set(CMAKE_CXX_COMPILER_TARGET ${tri})

试图强制工具链路径设置

除了CMakeCache.txt之外,请不要修改CMake创建的任何内容。下次CMake再次运行其配置/生成步骤时(例如,当工具链或CMakeLists.txt文件被更改时),它将丢失。

通过使用set(... CACHE INTERNAL "")语法,始终可以强制工具链文件中的工具路径设置。因此,在你的例子中,它看起来是:

代码语言:javascript
复制
SET(CMAKE_LINKER "/usr/bin/arm-linux-gnueabihf-ld" CACHE INTERNAL "")
SET(CMAKE_AR "/usr/bin/arm-linux-gnueabihf-ar" CACHE INTERNAL "")

参考资料

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

https://stackoverflow.com/questions/40497214

复制
相关文章

相似问题

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