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

ty

我正在尝试在Ubuntu 16.04 x86_64盒上交叉编译arm-linux-gnueabihf。我将Cmake与toolchain.cmake文件一起使用,其中可能将所有重要声明都声明为:

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<target>.dir我有g ++命令。我希望有像这样的跨工具链提供的编译器arm-linux-gnueabihf-g++

展望等link.txt其他<target>这是不是也有像交叉工具链命令来执行,但静态库/usr/bin/arm-linux-gnueabihf-ar

为什么我刚才G ++link.txt的可执行的目标,而不是ARM-Linux的gnueabihf-G ++

请帮忙,不然我会生气的..

添加我的toolchain.cmake文件:

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)
弗洛里安

检查正确的工具链前缀

通常,CMake会自动确定所需的前缀(并将其存储在内部变量中_CMAKE_TOOLCHAIN_PREFIX)。因此,请使用类似以下内容进行交叉检查:

message(STATUS "_CMAKE_TOOLCHAIN_PREFIX: ${_CMAKE_TOOLCHAIN_PREFIX}")

如果该值正确,但是您混合使用带和不带前缀的编译器工具,则可能是尝试/更改工具链文件中的内容的结果。请尝试删除包含CMake变量缓存(包括编译器ID)的二进制输出目录,然后重新从头开始构建。

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

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

message(STATUS "CMAKE_MAKE_PROGRAM: ${CMAKE_MAKE_PROGRAM}")

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

cmake -G "Ninja" -D... 

另请参阅此处

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

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

尝试使用非常基本/精简的工具链文件构建一个简单的“ Hello World”程序。

有关示例,请参见此处

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(triple arm-linux-gnueabihf)

set(CMAKE_C_COMPILER gcc)
set(CMAKE_C_COMPILER_TARGET ${triple})
set(CMAKE_CXX_COMPILER g++)
set(CMAKE_CXX_COMPILER_TARGET ${triple})

尝试强制使用“工具链路径”设置

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

您始终可以使用set(... CACHE INTERNAL "")语法在工具链文件中强制设置工具路径因此,在您的情况下,它看起来像:

SET(CMAKE_LINKER "/usr/bin/arm-linux-gnueabihf-ld" CACHE INTERNAL "")
SET(CMAKE_AR "/usr/bin/arm-linux-gnueabihf-ar" CACHE INTERNAL "")

参考

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Apollo Link 状态中的 __typename 应该是什么?

在查找数组中的最大数时,数组的正确声明应该是什么?

如何简洁地让编译器知道一个值应该是什么类型并检查它?

将ASP .NET投诉字典发送到服务器时,contentType应该是什么

交叉编译中的CMake CMAKE_AUTOMOC

在 IIS 中托管时,我的 MVC Core 应用程序的 Program 类应该是什么样的?

当没有数据要返回时,GraphQL突变返回类型应该是什么?

使用jpmml openscoring REST api时,pmml文件的输入应该是什么

使用unix套接字时Django ALLOWED_HOSTS应该是什么?

使用“in-package”时参数类型应该是什么?

重新启动单元文件时,模式和通道应该是什么

使用连续移动ONVIF时可选的`Timeout`值应该是什么值

不使用Dynamo DB本地时,端点URL应该是什么?

使用函数 randomForest 时,分类变量的类型应该是什么?

当仅使用社交提供商登录身份验证时,客户端和服务器之间的身份验证策略应该是什么?

使用android设备和“非模拟器”在本地主机上运行appengine时的地址应该是什么

当在表mysql中插入php数组的元素时应该是什么样的数据?只有字符串?

在XE16上编译Google Glass应用程序时,我的compileSdkVersion应该是什么?

交叉编译时,为什么不CMake CMAKE_FIND_ROOT_PATH和CMAKE_INCLUDE_PATH覆盖我的根文件系统?

与MinGW交叉编译时,GetSaveFileName的链接失败

提交给Google网站站长时,站点地图文件的名称应该是什么?

在导轨上使用bootstrap-sass红宝石时,application.scss应该是什么样子

在CSV文件中下载MySQL数据时,CSV文件的Content-Type应该是什么?

将向量传递给函数时,默认参数(如果有)应该是什么?

使用CMake GUI设置交叉编译器文件

mongodb update shell命令应该是什么

使用automake进行交叉编译时,重要的是什么?

CSS中的地址应该是什么(用于链接和图像)

Micronaut 中反应式控制器方法的返回类型应该是什么?