具体连接CMake的交叉编译并不参数传递给armlink根据具体连接CMake的交叉编译并不参数传递

2019-05-12 08:05发布

我试图交叉编译嵌入式的ARM Cortex一个项目的基础,但我无法得到的链接工作。 我想使用armlink,但没有文件被传递到armlink根据,因此没有.elf文件产生。

我的CMakeLists.txt是非常简单,如下。 该故障之后这表明armlink将被生成文件而没有任何参数调用所示。

任何指针将帮助 - 我搜索,看了很多帖子,但他们都似乎有更多参与的要求。

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一些愚蠢的问题是显而易见的人:

$ 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的东西,如:

armlink --map --ro-base=0x0 --rw-base=0x0008000 \
  --first='boot.o(RESET)' --datacompressor=off \
  CMakeFiles/blinky.dir/blinky.c.o -o blinky.elf

Answer 1:

与启动CMake的v3.5版本 ,你不需要为ARM的Keil C / C ++编译工具的工具链了:

对于ARM编译器(arm.com)与编译器ID ARMCC加入支持。

只要设置相应的C / CXX编译器变量

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"
      ...

参考

  • ARMCC工具链支持
  • 添加了ARM编译器支持(arm.com)
  • CMake的错误在的CMakeLists.txt:30(项目):无CMAKE_C_COMPILER可寻


Answer 2:

从我的经验,你可以不设置CMAKE_EXE_LINKER_FLAGS中的CMakeLists.txt文件。 它通过CMake的时候被调用的build目录的第一次一个CMAKE_TOOLCHAIN_FILE传递。

我没有找到有关这个问题的任何文件,但该用CMake的交叉编译页面如果你这样做交叉编译,你应该使用它。

一开始,只是把你set -calls在工具链文件并运行

cmake -DCMAKE_TOOLCHAIN_FILE=<yourfile.toolchain>

在一个干净的构建目录。



Answer 3:

工具链文件可能是一个好主意。 以下是我已经来到了我最后一次尝试CMake的2.8.10与DS-5工具链(它仍然可以进行优化,但它应该给你一个起点):

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的编译标志文件? )。 但似乎不顺心的配置步骤中是错误的。

我不知道你的命令行呼吁的CMake的配置/生成步骤,所以一般提示找到根本原因:

你可以尝试调用

cmake.exe --trace ...

看什么地方错了你CMAKE_EXE_LINKER_FLAGS变量。 这将产生大量的输出,所以这里有什么CMake的做了一些基础知识:

  • project()命令将触发编译器评测
  • 这将写CMAKE_EXE_LINKER_FLAGS到您的CMakeCache.txt
  • 你是一个局部变量覆盖它(参见变量的作用域实况这里 )

如果你看看share\cmake-2.8\Modules\CMakeCommonLanguageInclude.cmake

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

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设置其他标志。

“官方”的方式

设置官方途径目标的连接器和编译器标志是(前CMake的2.8.12):

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开始它会是这样的:

add_compile_options("--cpu=Cortex-M3")


文章来源: CMake cross-compile with specific linker doesn't pass arguments to armlink