【问题标题】:CMake: how to add compiler flags to non-default compilerCMake:如何将编译器标志添加到非默认编译器
【发布时间】:2010-12-13 09:06:39
【问题描述】:

您好,我想用 intel 编译器构建一个项目。

使用默认 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. 你需要指定CMAKE_CXX_FLAGS变量的类型:

    -DCMAKE_CXX_FLAGS:STRING=-I/some/path
    
  2. 您需要提供 C 和 C++ 编译器的完整路径:

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

【问题讨论】:

    标签: c++ cross-platform cmake


    【解决方案1】:

    我知道您不想编辑 CMakeLists.txt 文件,但是如何编辑它以允许用户选择编译器 - 类似于

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

    稍后,如果设置了MYVAR 变量,则执行add_includes()..?您还可以使用一些包查找实用程序(CMAKE 提供一些)来查找特定的编译器包含文件等。

    【讨论】:

      【解决方案2】:

      做你期望的事情的好方法是使用:

      export CC=icc CXX=icpc cmake -DCMAKE_CXX_FLAGS=-I/some/path  /path/to/project
      

      【讨论】:

        【解决方案3】:

        是否有某些原因导致您无法将包含路径(来自您的 CMAKE_CXX_FLAGS)添加到您的 CMakeLists.txt 文件中?

        add_includes(/some/path)
        

        【讨论】:

        • 是的。我不想编辑 CMakeLists.txt 因为它是通用文件,我只想为特定构建添加一些规范。 CMake 文件不应该知道用户的任何类型的本地路径。
        • 你的推理对我来说没有任何意义。为了使构建对其他人有效,他们还需要在该包含路径中找到的文件。如果是这种情况,并且它是您无法添加到项目中的第 3 方库,那么您应该有一个 Find 模块。在 CXX_FLAGS 变量中添加额外的包含路径是错误的做法。
        • "他们还需要在 包含路径中找到的文件。"你为什么这么认为,我用这些标志指向我的 foo-bar 库的一些自定义非标准位置。你的假设是错误的。另外... CMakeLists.txt 受源代码控制,所以我不想意外地将指向我的本地文件的不相关更改放到即将到来的树中。
        • 这就是 Find 模块的用途。您将自定义路径添加到搜索列表并将其提交到树中。将它放在不同位置的其他开发人员永远不会看到问题。查看一些现有 Find 模块的实现 - 它们位于 CMake Modules 目录中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-08
        • 2019-02-02
        相关资源
        最近更新 更多