结合 CMake option() 与 add_definitions()

Combining CMake option() with add_definitions()

目前我的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 以相同的方式 enabled/disabled。

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

问题:

谢谢!

如果您仅为此 NORMALS 功能使用 OpenMP,没关系。否则,您实际上混合了两件事 - 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()它,一次处理所有定义。