首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用特定链接器的CMake交叉编译不会将参数传递给armlink

使用特定链接器的CMake交叉编译不会将参数传递给armlink
EN

Stack Overflow用户
提问于 2015-05-19 05:53:37
回答 3查看 7.2K关注 0票数 7

我正在尝试交叉编译一个用于嵌入式ARM Cortex构建的项目,但我无法使链接器工作。我想使用armlink,但是没有文件传递给armlink,因此没有生成.elf文件。

我的CMakeLists.txt非常简单,如下所示。失败显示在之后,它显示了没有任何参数的makefile调用了armlink。

任何提示都会有帮助-我搜索和阅读了很多帖子,但它们似乎都有更复杂的要求。

代码语言:javascript
复制
cmake_minimum_required(VERSION 2.8)

project(test_arm)
enable_language(C ASM)

# Cross-compilation for ARM
SET(CMAKE_C_COMPILER armcc)
SET(CMAKE_LINKER armlink)
SET(CMAKE_C_LINK_EXECUTABLE armlink)

SET(CMAKE_C_FLAGS "--cpu=Cortex-M3")
SET(LINK_FLAGS "--map --ro-base=0x0 --rw-base=0x0008000 --first='boot.o(RESET)' --datacompressor=off")
SET(CMAKE_EXE_LINKER_FLAGS "--map --ro-base=0x0 --rw-base=0x0008000 --first='boot.o(RESET)' --datacompressor=off")

include_directories(../include)

add_executable(blinky blinky.c)
set_target_properties(blinky PROPERTIES LINKER_LANGUAGE C)

失败的原因如下,但我想这对某些人来说是显而易见的,因为我的CMakeLists中有一些愚蠢的问题:

代码语言:javascript
复制
$ make VERBOSE=1
[100%] Building C object CMakeFiles/blinky.dir/blinky.c.o
/usr/bin/cmake -E cmake_link_script CMakeFiles/blinky.dir/link.txt --verbose=1
armlink
Linking C executable blinky
Product: DS-5 Professional 5.21.0 [5210017]
Component: ARM Compiler 5.05 update 1 (build 106)
Tool: armlink [4d0efa]
For support see http://www.arm.com/support/
Software supplied by: ARM Limited
Usage: armlink option-list input-file-list
where
....

我原以为CMake生成的Makefile会使用如下内容调用armlink:

代码语言:javascript
复制
armlink --map --ro-base=0x0 --rw-base=0x0008000 \
  --first='boot.o(RESET)' --datacompressor=off \
  CMakeFiles/blinky.dir/blinky.c.o -o blinky.elf
EN

回答 3

Stack Overflow用户

发布于 2015-05-19 19:41:00

根据我的经验,您不能在CMakeLists.txt文件中设置CMAKE_EXE_LINKER_FLAGS。在构建目录中第一次调用CMake时,它必须通过CMAKE_TOOLCHAIN_FILE传递。

我没有找到任何关于这个问题的文档,但是有一个cross-compilation with CMake页面,如果你进行交叉编译,你应该使用它。

首先,只需将set-calls放入工具链文件中并运行

代码语言:javascript
复制
cmake -DCMAKE_TOOLCHAIN_FILE=<yourfile.toolchain>

在一个干净的构建目录中。

票数 1
EN

Stack Overflow用户

发布于 2015-05-19 20:45:43

工具链文件可能是个好主意。这是我最后一次使用DS-5工具链尝试CMake 2.8.10时想出来的(它仍然可以优化,但它应该给你一个起点):

代码语言:javascript
复制
INCLUDE(CMakeForceCompiler)

# This one is important
SET(CMAKE_SYSTEM_NAME Generic)
SET(CMAKE_SYSTEM_PROCESSOR arm)

# Specify the cross compiler
SET(CMAKE_C_COMPILER "C:/Program Files (x86)/DS-5/bin/armcc.exe")
SET(CMAKE_CXX_COMPILER "C:/Program Files (x86)/DS-5/bin/armcc.exe")
SET(CMAKE_AR "C:/Program Files (x86)/DS-5/bin/armar.exe" CACHE FILEPATH "Archiver")

#CMAKE_FORCE_C_COMPILER("C:/Program Files (x86)/DS-5/sw/gcc/bin/arm-linux-gnueabihf-gcc.exe" GNU)
#CMAKE_FORCE_CXX_COMPILER("C:/Program Files (x86)/DS-5/sw/gcc/bin/arm-linux-gnueabihf-g++.exe" GNU)

UNSET(CMAKE_C_FLAGS CACHE)
SET(CMAKE_C_FLAGS "--cpu=Cortex-A9 --thumb -Ospace" CACHE STRING "" FORCE)
UNSET(CMAKE_CXX_FLAGS CACHE)
SET(CMAKE_CXX_FLAGS ${CMAKE_C_FLAGS} CACHE STRING "" FORCE)
UNSET(CMAKE_EXE_LINKER_FLAGS CACHE)
SET(CMAKE_EXE_LINKER_FLAGS "" CACHE STRING "" FORCE)
UNSET(CMAKE_AR_FLAGS CACHE)
SET(CMAKE_AR_FLAGS "-p -armcc,-Ospace" CACHE STRING "" FORCE)

# set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS>")
SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> ${CMAKE_AR_FLAGS} -o <TARGET> <OBJECTS>" CACHE STRING "C Archive Create")
# set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS>")
SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> ${CMAKE_AR_FLAGS} -o <TARGET> <OBJECTS>" CACHE STRING "CXX Archive Create")

include_directories("C:/Program Files (x86)/DS-5/include")
#include_directories("C:/Program Files (x86)/DS-5/sw/gcc/arm-linux-gnueabihf/libc/usr/include/arm-linux-gnueabi")

# Where is the target environment
SET(CMAKE_FIND_ROOT_PATH "C:/Program Files (x86)/DS-5")

# Search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

# For libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

关于你的问题

一些失败的分析

你尝试过的东西应该是有效的(另请参阅)。但似乎在配置步骤中出现了一些问题。

我不知道你的命令行调用CMake的配置/生成步骤,所以一些通用的提示来找出根本原因:

你可以试着打电话给

代码语言:javascript
复制
cmake.exe --trace ...

来看看你的CMAKE_EXE_LINKER_FLAGS变量出了什么问题。这将生成大量输出,因此以下是有关CMake功能的一些基础知识:

使用局部变量覆盖时,

  • project()命令将触发编译器,并将CMAKE_EXE_LINKER_FLAGS写入CMakeCache.txt
  • You (请参见variable scope docu here)

如果你研究一下share\cmake-2.8\Modules\CMakeCommonLanguageInclude.cmake

代码语言:javascript
复制
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS_INIT} $ENV{LDFLAGS}"
     CACHE STRING "Flags used by the linker.")

您可以使用CMAKE_EXE_LINKER_FLAGS_INIT,但必须在project()命令之前或在工具链文件中设置它。

因为您将链接语言设置为C,所以让我们来看看share\cmake-2.8\Modules\CMakeCInformation.cmake

代码语言:javascript
复制
if(NOT CMAKE_C_LINK_EXECUTABLE)
  set(CMAKE_C_LINK_EXECUTABLE
    "<CMAKE_C_COMPILER> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS>  -o <TARGET> <LINK_LIBRARIES>")
endif()

因此,您可以使用CMAKE_C_LINK_EXECUTABLE覆盖完整的链接器调用,也可以使用CMAKE_C_LINK_FLAGS设置其他标志。

“官方”方式

设置target's linker and compiler flags的官方方法是(在CMake 2.8.12之前):

代码语言:javascript
复制
set_property(TARGET blinky APPEND_STRING PROPERTY COMPILE_FLAGS "--cpu=Cortex-M3")
set_property(TARGET blinky APPEND_STRING PROPERTIES LINK_FLAGS "--map --ro-base=0x0 --rw-base=0x0008000 --first='boot.o(RESET)' --datacompressor=off")

从CMake 2.8.12开始,应该是这样的:

代码语言:javascript
复制
add_compile_options("--cpu=Cortex-M3")
票数 1
EN

Stack Overflow用户

发布于 2016-07-14 03:57:06

CMake v3.5开始,您不再需要Keil ARM C/C++编译工具的工具链:

添加了对编译器id为ARMCC的ARM编译器(arm.com)的

支持。

只需相应地设置C/CXX编译器变量

代码语言:javascript
复制
cmake -DCMAKE_C_COMPILER:PATH="C:\Program Files (x86)\DS-5\bin\armcc.exe"
      -DCMAKE_CXX_COMPILER:PATH="C:\Program Files (x86)\DS-5\bin\armcc.exe"
      ...

参考

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

https://stackoverflow.com/questions/30313387

复制
相关文章

相似问题

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