CMake - 将选项集成到 C++ 源文件中

4
我正在处理一个现有项目的CMake文件。但是,我现在有点糊涂,不知道如何将CMake选项集成到实际源代码中。 假设我只想在CMake上值为“ON”时执行位于example.cpp内的cout << "print";这一段代码。
该项目的目录结构如下所示: folder layout 使用上述示例,我做了以下操作:
  1. 在父项目的CMakeLists.txt中,我添加了“OPTION( ENABLE_PRINT "Enable Print" ON)”
  2. 然后,在示例子项目的源代码文件夹Config.h文件中,我添加了“#define ENABLE_PRINT”
  3. 在位于示例子项目中的Config.h.in中,我添加了“#cmakedefine ENABLE_PRINT”
  4. 最后,在源文件example.cpp中,我用#ifdef ENABLE_PRINT和#endif环绕了cout << "print";。
做出这些更改后,项目将配置并生成。但是,在制作软件时,会出现错误,并告诉我,用#ifdef括起来的代码块根本没有被执行;它被忽略了。换句话说,我采取的上述步骤除了将我想要进行条件编译的代码注释掉之外,什么都没做。
那么,我该如何使其正常工作?

你能提供实际生成的cpp文件、生成的config.h文件和实际的编译器错误信息吗? - Artem Tokmakov
抱歉,我不确定你在问什么。你是指实际的文件还是CMake从中生成的文件?如果你是指实际的文件:该项目非常大,这将非常困难。但是,我上面的示例项目基本上是正在进行的简化副本。其中一个错误是: ../vlApplication/libvlapp.a(vlMPIApplication.cpp.o): In function 'VLAPP::MPIApplication::draw()': vlMPIApplication.cpp:(.text+0x3043): undefined reference to 'VLUTIL::Timers::MPITimerManager::syncMultiTimers() - assignment_operator
据我所知,它找不到syncMultiTimers()函数,而这是我在#ifdef之间的一个函数。 - assignment_operator
如果您的简化项目可以重现此问题,那就足够了。我想看看您在问题中提到的example.cpp和Config.h的示例(假设您确实有这个小的可重现项目)。现在,您给出的错误确实表明该方法缺失。当您期望它存在时,是否是这种情况,即选项“on”处于打开状态?您确定您的ifdefs和宏是正确的吗? - Artem Tokmakov
2个回答

9

您可以像这里那样将cmake的optionadd_definitions组合起来。由于一个简单的示例比长篇文本更清晰,因此这里是一个小的main.c:

 #include<stdio.h>

 int main(int argc, char *argv[])
 {
   printf("start\n");
   #ifdef USE_DEBUG
     printf("Using debug\n");
   #endif
   printf("end\n");
   return 0;
 }

CMakeLists.txt 是:

cmake_minimum_required (VERSION 2.6)
project (HELLO) 

option(WITH_DEBUG "Use debug" OFF)

if (WITH_DEBUG)
  MESSAGE(STATUS "WITH_DEBUG")
  add_definitions(-DUSE_DEBUG)
endif()

add_executable (main main.c) 

您可以通过输入cmake .cmake . -DWITH_DEBUG=ON,然后再使用make./main命令来尝试它。


1
这比浏览配置文件更加优雅,而且能够出色地完成工作。太棒了。 - assignment_operator

1

@francis的回答很好,不过我也建议使用compile_definitions而不是add_definitions,并且为现代cmake模块化指定目标:

cmake_minimum_required (VERSION 2.6)
project (HELLO) 

option(WITH_DEBUG "Use debug" OFF)

add_executable (main main.c) 

if (WITH_DEBUG)
  MESSAGE(STATUS "WITH_DEBUG")
  target_compile_definitions(main PRIVATE USE_DEBUG)
endif()

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