CMake:如何向非默认编译器添加编译器标志

3

你好,我希望使用英特尔编译器来构建一个项目。

通常情况下,我会使用默认的gcc运行以下命令:

cmake -DCMAKE_CXX_FLAGS=-I/some/path  /path/to/project

这个是没问题的。

cmake -DCMAKE_CXX_COMPILER=icpc -DCMAKE_C_COMPILER=icc  -DCMAKE_CXX_FLAGS=-I/some/path  /path/to/project

当我尝试使用非默认编译器时,它根本没有将CMAKE_CXX_FLAGS变量内容传递给编译器。

如何解决这个问题?

正确答案是:

  1. You need to specify the type of the CMAKE_CXX_FLAGS variable:

    -DCMAKE_CXX_FLAGS:STRING=-I/some/path
    
  2. You need to provide full path to C and C++ compilers:

    cmake -DCMAKE_C_COMPILER=/opt/intel/bin/icc -DCMAKE_CXX_COMPILER=/opt/intel/bin/icpc -DCMAKE_CXX_FLAGS:STRING=-some-flag
    
3个回答

6
你期望的最好做法是使用以下方法:
export CC=icc CXX=icpc cmake -DCMAKE_CXX_FLAGS=-I/some/path  /path/to/project

3

你为什么不能将 include 路径(从你的 CMAKE_CXX_FLAGS)添加到你的 CMakeLists.txt 文件中呢?

add_includes(/some/path)

是的。我不想编辑CMakeLists.txt文件,因为它是通用文件,我只想为特定构建添加一些规格。CMake文件不应该知道用户的任何本地路径。 - Artyom
1
你的推理对我来说毫无意义。为了使构建适用于其他人,他们还需要在包含路径中找到的文件。如果是这种情况,并且它是一个无法添加到项目中的第三方库,则应该为其编写一个查找模块。将其他包含路径放入CXX_FLAGS变量中是错误的做法。 - greyfade
他们还需要包含在 那个 路径中找到的文件。为什么这么说呢,因为我用这些标志指向了我的foo-bar库的某个自定义非标准位置。你的假设是错误的。另外... CMakeLists.txt是在源代码控制之下的,所以我不想意外地把指向我的本地文件的不相关更改放入即将发布的树中。 - Artyom
这就是Find模块的作用。您可以将自定义路径添加到搜索列表中并提交到树中。其他开发人员如果将其放在不同位置,也不会出现问题。看看一些现有Find模块的实现 - 它们在CMake模块目录中。 - greyfade

2

我知道您不想编辑CMakeLists.txt文件,但是允许用户选择编译器进行编辑怎么样?类似于:

SET(MYVAR TRUE CACHE BOOL "Use intel compiler?")

如果MYVAR变量已设置,之后可以执行add_includes()函数...?您还可以使用一些包查找工具(CMAKE提供了一些)来查找特定的编译器包含文件等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接