Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake:如何为单个目标更改编译器_Cmake_Target - Fatal编程技术网

CMake:如何为单个目标更改编译器

CMake:如何为单个目标更改编译器,cmake,target,Cmake,Target,我有一个使用交叉编译器的嵌入式项目。我想介绍一下GoogleTest,它是用本地GCC编译器编译的。另外,使用CTC编译器构建一些单元测试目标 简而言之: 我有3个不同的目标,并用3个不同的编译器编译它们。如何在CMakeLists.txt中表达?我尝试了设置目标属性 但似乎无法使用此命令设置CXX变量 CMake是一个make文件生成器。它会生成一个文件,然后您可以使用该文件进行构建。如果要创建多个目标平台,则需要使用不同的生成器多次运行CMake 因此,您想在CMake中执行的操作是不可能的

我有一个使用交叉编译器的嵌入式项目。我想介绍一下GoogleTest,它是用本地GCC编译器编译的。另外,使用CTC编译器构建一些单元测试目标

简而言之:
我有3个不同的目标,并用3个不同的编译器编译它们。如何在CMakeLists.txt中表达?我尝试了
设置目标属性


但似乎无法使用此命令设置
CXX变量

CMake是一个make文件生成器。它会生成一个文件,然后您可以使用该文件进行构建。如果要创建多个目标平台,则需要使用不同的生成器多次运行CMake


因此,您想在CMake中执行的操作是不可能的,但使用CMake:您可以创建一个shell脚本,多次调用CMake。

我现在遇到了同样的问题,但另一个答案对我没有帮助。我也在交叉编译,我需要用GCC编译一些实用程序,但我的核心代码要用AVRCC编译

基本上,如果您有一个
CMakeLists.txt
,并且希望使用另一个编译器编译此文件中的所有目标,则可以手动设置变量

在某处定义这些宏:

macro(use_host_compiler)
  if (${CURRENT_COMPILER} STREQUAL "NATIVE")
    # Save current native flags
    set(NATIVE_C_FLAGS ${CMAKE_C_FLAGS} CACHE STRING "GCC flags for the native compiler." FORCE)

    # Change compiler
    set(CMAKE_SYSTEM_NAME ${CMAKE_HOST_SYSTEM_NAME})
    set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_HOST_SYSTEM_PROCESSOR})
    set(CMAKE_C_COMPILER ${HOST_C_COMPILER})
    set(CMAKE_C_FLAGS ${HOST_C_FLAGS})
    set(CURRENT_COMPILER "HOST" CACHE STRING "Which compiler we are using." FORCE)
  endif()
endmacro()


macro(use_native_compiler)
  if (CMAKE_CROSSCOMPILING AND ${CURRENT_COMPILER} STREQUAL "HOST")
    # Save current host flags
    set(HOST_C_FLAGS ${CMAKE_C_FLAGS} CACHE STRING "GCC flags for the host compiler." FORCE)

    # Change compiler
    set(CMAKE_SYSTEM_NAME ${NATIVE_SYSTEM_NAME})
    set(CMAKE_SYSTEM_PROCESSOR ${NATIVE_SYSTEM_PROCESSOR})
    set(CMAKE_C_COMPILER ${NATIVE_C_COMPILER})
    set(CMAKE_C_FLAGS ${NATIVE_C_FLAGS})
    set(CURRENT_COMPILER "NATIVE" CACHE STRING "Which compiler we are using." FORCE)
  endif()
endmacro()
在CMakeLists.txt脚本的开头(或在工具链文件中),根据需要设置以下变量:

  • 当前编译器
  • HOST\u C\u编译器
  • HOST\u C\u标志
  • NATIVE\u SYSTEM\u NAME
  • NATIVE\u C\u编译器
  • NATIVE\u C\u标志
其思想是
CMAKE_C_COMPILER
(和company)与其他任何变量一样是一个变量,因此将其设置在某个范围内只会使其在该范围内发生更改


用法示例:

use_host_compiler()
add_executable(foo foo.c) # Compiled with your host (computer)'s compiler.
use_native_compiler()
add_executable(bar bar.c) # Compiled with your native compiler (e.g. `avr-gcc`).

没有合适的方法为单个目标更改编译器

根据cmake手册“一旦设置,您就不能更改此变量”。这是关于
CMAKE\uu编译器的


AnthonyD973提出的解决方案似乎不起作用,这当然令人悲哀。在一个项目中使用多个编译器而不使用自定义命令是非常有用的。

我倾向于同意这一点,但您可以创建自定义目标,使用其他工具链文件调用cmake,构建并安装到一些中间阶段目录,导出导入可执行文件。。。虽然可能比外部脚本更难,但从外部看可能会更好。我的处境相同,我需要为不同的目标使用不同的编译器。我试过你的例子,但没法成功。添加的可执行文件总是使用clang而不是我的替代编译器构建。有什么建议可以让这项功能发挥作用吗?很难说什么时候您没有访问代码的权限,但是您可以在调用
add\u executable
(或
add\u library
或您正在使用的任何工具)之前,尝试使用
message()
打印变量的值,看看它们是否仍然根据您当时的需要进行设置。还要确保您使用的是
macro()
而不是
function()
,因为在函数中设置变量会使其在调用者的作用域中保持不变,而在
macro()
中设置的变量在调用者的作用域中保持该值。感谢您的回复。是的,我是在宏而不是函数中完成的。我已经试过打印变量值了。这是定义可执行文件之前的输出--将编译器切换到测试…--CMAKE_系统名称:TEST_系统--CMAKE_系统处理器:--CMAKE_C_编译器:/home/me/scripts/clang_wrapper.py--CMAKE_CXX编译器:/home/me/scripts/clang_wrapper++.py--CMAKE_C_标志:--CMAKE_CXX标志:-当前编译器:TESTI不熟悉您的
clang_wrapper.py。很可能,
clangu wrapper.py
不接受与gcc/g++相同的参数,这将导致CMake使用gcc的参数调用它,比如
-o outputfile.o-c inputfile.c
,这可能是
clangu wrapper.py
的无效参数。我们的包装器脚本设计用于处理clang/gcc参数。没有迹象表明这是失败的。看起来不可能为同一个配置了CMake的构建定义N个编译器。如果没有多个配置过程(为每个过程指定编译器和不同的构建目录),我找不到任何方法来实现这一点。我决定扭转这个问题,用包装器构建我们的所有目标,对于大多数目标,它只调用clang,在其他情况下,它执行我们需要执行的特殊任务。这对我来说解决了这个问题。在我看来,这不应该作为答案发布,而应该作为评论发布。我还没有尝试复制,但如果它不再有效,可能是CMake更新破坏了这一点。它肯定曾经工作过;我们建立了一个项目,将交叉编译一些程序和我在答案中发布的代码。你使用的是哪个CMake版本,而另一个答案中的代码不起作用?我的Ubuntu 19.04上有3.13.4。