【问题标题】:Why does CMake ignore exported CXX and CC environment variables?为什么 CMake 会忽略导出的 CXX 和 CC 环境变量?
【发布时间】:2016-10-13 18:09:27
【问题描述】:

我正在运行这样的 CMake (3.4.3),如 CMake FAQ's 中所述:

export CC="cc_args.py $PWD/../bin/gcc"
export CXX="cc_args.py $PWD/../bin/g++"
cmake -DCMAKE_BUILD_TYPE=Debug ..

但是,当我打印CMAKE_CXX_COMPILERCMAKE_C_COMPILER 时,它仍然指向/usr/bin 中的系统默认编译器。它仅在我像这样显式读入环境变量时才有效:

IF (NOT $ENV{CC} STREQUAL "")
  SET(CMAKE_C_COMPILER $ENV{CC})
ENDIF ()
IF (NOT $ENV{CXX} STREQUAL "")
  SET(CMAKE_CXX_COMPILER $ENV{CXX})
ENDIF ()

但即便如此,构建也会失败并显示以下消息:

/bin/sh: 1: /home/peterg/bin/cc_args.py /home/peterg/Code/build/../bin/g++: not found

但是我确信所有路径都是正确的,因为只执行两个冒号之间的路径会按预期输出:

g++: fatal error: no input files
compilation terminated.

更新:

编译过程似乎不喜欢编译器路径中的空格。我现在创建了两个脚本(一个用于 GCC,一个用于 CC),它们包装命令并传播参数,这似乎有效。但我似乎仍然在做一些根本错误的事情,因为 CMake 也不接受导出的 CC=proxy_script_cc.shGCC=proxy_script_gcc.sh 变量本身没有空格。

【问题讨论】:

  • 只用-DCMAKE_CXX_COMPILER,不要乱用shell变量。
  • 我认为您要搜索的内容类似于 set_directory_properties(PROPERTIES RULE_LAUNCH_COMPILE "bash proxy_script_cc.sh") 或全局变量 CMAKE_<LANG>_COMPILER_LAUNCHER
  • @Florian cc_args.py 脚本封装了编译器以提取自动完成信息。
  • 对我来说,CMake 在 Windows 上会忽略 ENV{CC},但在 CentOS 上不会。在这两种情况下,GCC 的路径中都没有空格。

标签: cmake


【解决方案1】:

把我的评论变成答案

问题

我已经给你一个代码尝试并且可以重现你的问题

CMake Error at [...]/cmake-3.5/Modules/CMakeDetermineCXXCompiler.cmake:56 (message):
  Could not find compiler set in environment variable CXX:

  cc_args.py [... PWD ...]/../bin/g++.

如果我查看CMakeDetermineCXXCompiler.cmake 代码和get_filename_component() 文档,它只是意味着它没有在“系统搜索路径”或相对于您的二进制输出目录中找到cc_args.py

解决方案

所以当你给二进制输出目录的完整路径或相对路径时,它确实有效

export CC="../cc_args.py ../bin/gcc"
export CXX="../cc_args.py ../bin/g++"

替代方案

CMake 确实允许定义“启动器脚本”,例如CMAKE_<LANG>_COMPILER_LAUNCHER

$ cmake -DCMAKE_BUILD_TYPE=Debug 
        -DCMAKE_C_COMPILER_LAUNCHER=../cc_args.py 
        -DCMAKE_CXX_COMPILER_LAUNCHER=../cc_args.py 
        ..

参考文献

【讨论】:

    【解决方案2】:

    -DCMAKE_CXX_COMPILER=<path/to/compiler> 传递给您的 CMake 调用。与摆弄 shell 变量相比,这更不容易出错。

    【讨论】:

    • 那个标志到底是做什么的?
    • 通过这个标志,你可以知道 CMake 应该使用的 C++ 编译器的路径。
    猜你喜欢
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多