【问题标题】:CMake - integrating options into C++ source filesCMake - 将选项集成到 C++ 源文件中
【发布时间】:2014-08-31 01:10:06
【问题描述】:

我正在处理一个现有项目并为它清理 CMake。但是,现在我对如何将 CMake 选项集成到实际源代码中感到有些困惑。

为简单起见,假设我只想执行一段代码,假设 cout << "print";example.cpp 内,如果在 CMake 上,值 ENABLE_PRINT 设置为 ON

项目目录将如下所示:

使用上面的例子,我做了以下事情:

  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 包围的代码块根本没有执行;它被忽略了。换句话说,我采取的上述步骤除了“注释掉”我想要以 ENABLE_PRINT 为条件的代码块之外没有做任何事情。

那么,我该怎么做呢?

【问题讨论】:

  • 能否提供实际生成的 cpp 文件、生成的 config.h 文件和实际的编译器(?)错误信息?
  • 我不确定我是否得到您的要求,抱歉。您是指实际文件还是 CMake 将从它们生成的任何内容?如果您指的是实际文件:该项目非常大,这将非常困难。但是,我上面的示例项目几乎是正在发生的事情的简化副本。错误之一是:../vlApplication/libvlapp.a(vlMPIApplication.cpp.o): In function 'VLAPP::MPIApplication::draw()': vlMPIApplication.cpp:(.text+0x3043): undefined reference to 'VLUTIL::Timers::MPITimerManager::syncMultiTimers()
  • 即(据我所知),它找不到我的#ifdef 之间的函数syncMultiTimers()
  • 如果这对您的简化项目进行重现,那就足够了。我想看看您在问题中提到的 example.cpp 和 Config.h(假设您实际上有这个小型 repro 项目)。现在,您给出的错误确实是说缺少该方法。当您期望它存在时是否是这种情况,即在这种情况下选项“打开”?你确定你的 ifdef 和宏是正确的吗?

标签: c++ cmake c-preprocessor configure


【解决方案1】:

你可以像here一样组合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 来尝试

【讨论】:

  • 这比浏览配置文件要优雅得多,而且做得很好。太棒了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 2011-04-13
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
相关资源
最近更新 更多