cmake 交叉编译 GNU 工具
cmake Cross Compiling GNU Tools
我使用 https://launchpad.net/gcc-arm-embedded 工具链进行 cortex m4 开发。
我在 windows7 机器上安装了多个版本的 GNU ARM 工具链。
c:\Program Files (x86)\GNU Tools ARM Embedded\
4.7 2013q2
4.8 2013q4
4.9 2014q4
4.9 2015 年第一季度
我用的是最新的cmake版本3.2.2
如何强制使用特殊工具链作为示例 4.9 2014q4 ???
我在网上看了很多东西;我还搜索了一些用于 ARM 的工具链文件。
所以这个文件是我在网上找到的所有信息的一堆,或者 github...但是它没有像我预期的那样工作
这是文件。
开始文件
include(CMakeForceCompiler)
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR cortex-m4)
# cmake calls this file twice
#if( NOT cross_configure )
#set(cross_configure 1)
## standard way
#CMAKE_FORCE_C_COMPILER(arm-none-eabi-gcc GNU)
#CMAKE_FORCE_CXX_COMPILER(arm-none-eabi-g++ GNU)
# search for the toolchain
if(NOT TOOLCHAIN_DIR)
set(TOOLCHAIN_DIR "c:/Program Files (x86)/GNU Tools ARM Embedded/4.9 2014q4")
else()
message(STATUS ${TOOLCHAIN_DIR} )
endif()
find_program(GNU_ARM_C arm-none-eabi-gcc ${TOOLCHAIN_DIR})
find_program(GNU_ARM_CXX arm-none-eabi-g++ ${TOOLCHAIN_DIR})
find_program(GNU_ARM_OBJCOPY arm-none-eabi-objcopy ${TOOLCHAIN_DIR})
find_program(GNU_ARM_SIZE_TOOL arm-none-eabi-size ${TOOLCHAIN_DIR})
CMAKE_FORCE_C_COMPILER(${GNU_ARM_C} GNU)
CMAKE_FORCE_CXX_COMPILER(${GNU_ARM_CXX} GNU)
# works without
#set(CMAKE_ASM_COMPILER ${GNU_ARM_C})
# Find the target environment prefix..
# First see where gcc is keeping libc.a
execute_process(
COMMAND ${CMAKE_C_COMPILER} -print-file-name=libc.a
OUTPUT_VARIABLE CMAKE_INSTALL_PREFIX
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# Strip the filename off
get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" PATH)
# Then find the canonical path to the directory one up from there
get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/.." REALPATH)
set(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} CACHE FILEPATH "Install path prefix, prepended onto install directories.")
message(STATUS "cross compiling with gnu tools ...")
message(STATUS "toolchain prefix: ${CMAKE_INSTALL_PREFIX}")
set(CMAKE_FIND_ROOT_PATH ${CMAKE_INSTALL_PREFIX})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
文件结束
第一次尝试:
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchain-gnu-tools-arm-embedded-cortex-m4.cmake -G"MinGW Makefiles" ../
所以我尝试了一下 => 它使用系统路径中的编译器工作。最新版本在该路径上 (4.9 2015q1)
第二次尝试:
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchain-gnu-tools-arm-embedded-cortex-m4.cmake -DTOOLCHAIN_DIR="c:\Program Files (x86)\GNU Tools ARM Embedded.9 2014q4" -G"MinGW Makefiles" ../
=> 我使用了非源构建 我删除了整个构建目录并重新 运行..
=> 但它不能那样工作...cmake 再次在路径上使用编译器。
第三次尝试:
我从系统路径中删除了编译器 => 重新启动后它工作了。
但我想编写一个工具链文件,它在一个特殊的 version/path 上选择编译器......如果系统路径上有一个版本,这也应该有效。
这可以用cmake实现吗?我搜索了很多,但没有找到解决方案。
感谢帮助
您必须指定编译器路径,您也可以在您的工具链中指定它们,但是不推荐:
set(CMAKE_C_COMPILER "C:/path/to/my/gcc-4.2")
set(CMAKE_CXX_COMPILER "C:/path/to/my/gcc-4.2")
相反,您可以在命令行中传递这些路径:
cmake . -G "MinGW Makefiles" -D CMAKE_C_COMPILER="C:/MinGW2/bin/gcc.exe" -D CMAKE_CXX_COMPILER="C:/MinGW2/bin/g++.exe"
我刚刚试过了,它可以工作,我在 MinGW 中有另一个 gcc,但它加载了 MinGW2 文件夹中的那个。
我使用 https://launchpad.net/gcc-arm-embedded 工具链进行 cortex m4 开发。
我在 windows7 机器上安装了多个版本的 GNU ARM 工具链。 c:\Program Files (x86)\GNU Tools ARM Embedded\ 4.7 2013q2 4.8 2013q4 4.9 2014q4 4.9 2015 年第一季度
我用的是最新的cmake版本3.2.2
如何强制使用特殊工具链作为示例 4.9 2014q4 ???
我在网上看了很多东西;我还搜索了一些用于 ARM 的工具链文件。
所以这个文件是我在网上找到的所有信息的一堆,或者 github...但是它没有像我预期的那样工作
这是文件。
开始文件
include(CMakeForceCompiler)
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR cortex-m4)
# cmake calls this file twice
#if( NOT cross_configure )
#set(cross_configure 1)
## standard way
#CMAKE_FORCE_C_COMPILER(arm-none-eabi-gcc GNU)
#CMAKE_FORCE_CXX_COMPILER(arm-none-eabi-g++ GNU)
# search for the toolchain
if(NOT TOOLCHAIN_DIR)
set(TOOLCHAIN_DIR "c:/Program Files (x86)/GNU Tools ARM Embedded/4.9 2014q4")
else()
message(STATUS ${TOOLCHAIN_DIR} )
endif()
find_program(GNU_ARM_C arm-none-eabi-gcc ${TOOLCHAIN_DIR})
find_program(GNU_ARM_CXX arm-none-eabi-g++ ${TOOLCHAIN_DIR})
find_program(GNU_ARM_OBJCOPY arm-none-eabi-objcopy ${TOOLCHAIN_DIR})
find_program(GNU_ARM_SIZE_TOOL arm-none-eabi-size ${TOOLCHAIN_DIR})
CMAKE_FORCE_C_COMPILER(${GNU_ARM_C} GNU)
CMAKE_FORCE_CXX_COMPILER(${GNU_ARM_CXX} GNU)
# works without
#set(CMAKE_ASM_COMPILER ${GNU_ARM_C})
# Find the target environment prefix..
# First see where gcc is keeping libc.a
execute_process(
COMMAND ${CMAKE_C_COMPILER} -print-file-name=libc.a
OUTPUT_VARIABLE CMAKE_INSTALL_PREFIX
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# Strip the filename off
get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" PATH)
# Then find the canonical path to the directory one up from there
get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/.." REALPATH)
set(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} CACHE FILEPATH "Install path prefix, prepended onto install directories.")
message(STATUS "cross compiling with gnu tools ...")
message(STATUS "toolchain prefix: ${CMAKE_INSTALL_PREFIX}")
set(CMAKE_FIND_ROOT_PATH ${CMAKE_INSTALL_PREFIX})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
文件结束
第一次尝试:
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchain-gnu-tools-arm-embedded-cortex-m4.cmake -G"MinGW Makefiles" ../
所以我尝试了一下 => 它使用系统路径中的编译器工作。最新版本在该路径上 (4.9 2015q1)
第二次尝试:
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchain-gnu-tools-arm-embedded-cortex-m4.cmake -DTOOLCHAIN_DIR="c:\Program Files (x86)\GNU Tools ARM Embedded.9 2014q4" -G"MinGW Makefiles" ../
=> 我使用了非源构建 我删除了整个构建目录并重新 运行.. => 但它不能那样工作...cmake 再次在路径上使用编译器。
第三次尝试: 我从系统路径中删除了编译器 => 重新启动后它工作了。
但我想编写一个工具链文件,它在一个特殊的 version/path 上选择编译器......如果系统路径上有一个版本,这也应该有效。
这可以用cmake实现吗?我搜索了很多,但没有找到解决方案。
感谢帮助
您必须指定编译器路径,您也可以在您的工具链中指定它们,但是不推荐:
set(CMAKE_C_COMPILER "C:/path/to/my/gcc-4.2")
set(CMAKE_CXX_COMPILER "C:/path/to/my/gcc-4.2")
相反,您可以在命令行中传递这些路径:
cmake . -G "MinGW Makefiles" -D CMAKE_C_COMPILER="C:/MinGW2/bin/gcc.exe" -D CMAKE_CXX_COMPILER="C:/MinGW2/bin/g++.exe"
我刚刚试过了,它可以工作,我在 MinGW 中有另一个 gcc,但它加载了 MinGW2 文件夹中的那个。