【问题标题】:Combining CMake option() with add_definitions()将 CMake option() 与 add_definitions() 结合使用
【发布时间】:2015-12-20 00:11:07
【问题描述】:

目前我的 CMakeLists.txt 中有以下内容(下面仅列出了此问题的基本部分):

option(NORMALS_WITH_OPENMP "Enable OpenMP for estimating the normals of a point cloud" OFF)
if(NORMALS_WITH_OPENMP)
  message("OpenMP enabled")
  add_definitions(-DENABLE_OPENMP)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
endif()

在我的一个源文件中:

#ifdef ENABLE_OPENMP
  #include <pcl/features/normal_3d_omp.h>
#else
  #include <pcl/features/normal_3d.h>
#endif

以及该源文件中代码中的其他位置也会根据ENABLE_OPENMP 是否已定义而以相同的方式启用/禁用。

我对此的要求是能够简要描述 OpenMP 支持(使用 option()),然后如果选项设置为 ON 添加 ENABLE_OPENMP 定义,以便我的代码的编译方式不同(使用add_definitions())。

问题:

  • 这是正确的做法还是有更优雅的方式来处理这种情况?

  • 我是否可以省略两者之一,或者我真的必须将两者结合起来才能满足我上面列出的要求?

谢谢!

【问题讨论】:

  • 你用对了。有条件的add_definitions() 的替代方案可以是无条件的set(ENABLE_OPENMP ${NORMALS_WITH_OPENMP}) 与文件中的configure_file() 结合,包含行#cmakedefine ENABLE_OPENMP(并将结果文件包含到您的源/标题中)。但是没有条件附加CMAKE_CXX_FLAGS 的替代方法。这是否也回答了您的第二个问题,还是有其他含义?

标签: c++ c macros cmake conditional-compilation


【解决方案1】:

如果您仅将 OpenMP 用于此 NORMALS 功能,没关系。否则,您实际上混合了两件事 - OpenMP 使用并将其用于NORMALS。如果您使用 OpenMP 实现了更多可选功能,您应该这样做:

find_package(OpenMP)

# enable OpenMP if compiler supports it
if(OpenMP_FOUND)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
endif()

# let user choose each option if OpenMP is there
if(OpenMP_FOUND)
  option(NORMALS_WITH_OPENMP "Blabla" OFF)
  option(ANOTHER_THING_WITH_OPENMP "Blabla" ON)
endif()

现在您可以有条件地使用add_definitions(-DFEATURE),或者按照@Tsyvarev 的建议,创建一个带有行的config.h.cmake 文件

#cmakedefine NORMALS_WITH_OPENMP
#cmakedefine ANOTHER_THING_WITH_OPENMP

configure_file() 它,同时处理所有定义。

【讨论】:

  • 所以让我澄清一下 - 如果我使用配置文件,我不需要使用add_definitions() 并且可以在我的源代码中使用NORMALS_WITH_OPENMP
  • 顺便说一句,因为我正在使用gcc find_package(OpenMP) 是没用的,什么也不做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 2018-11-24
  • 1970-01-01
相关资源
最近更新 更多