c++ - 结合 CMake option() 与 add_definitions()

标签 c++ c macros cmake conditional-compilation

目前我的 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())。

问题:

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

  • 我可以省略两者之一,还是必须结合使用两者才能满足上面列出的要求?

谢谢!

最佳答案

如果您仅将 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() 它,一次处理所有定义。

关于c++ - 结合 CMake option() 与 add_definitions(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32726639/

相关文章:

c - 如何在不使用任何内置函数的情况下将整数转换为 C 字符串,反之亦然以及其他数据类型?

c - 文件写入C困惑

c - 使用## 和# 运算符连接 C 宏中的字符串

ruby-on-rails - 创建或覆盖 Rails Active Record 宏

c++ - 忽略 SIGSEGV 并继续执行

c++ - 我在使用 WaitForDebugEvent EXCEPTION_DEBUG_EVENT 时遇到问题

c++ - 在 C++ 中从 C dll 生成对象

macros - 在 Rust 中声明变量的宏?

C++ 类继承顺序

c++ - 如何编译头文件、实现、驱动文件