【发布时间】:2014-08-31 01:10:06
【问题描述】:
我正在处理一个现有项目并为它清理 CMake。但是,现在我对如何将 CMake 选项集成到实际源代码中感到有些困惑。
为简单起见,假设我只想执行一段代码,假设 cout << "print"; 在 example.cpp 内,如果在 CMake 上,值 ENABLE_PRINT 设置为 ON。
项目目录将如下所示:
使用上面的例子,我做了以下事情:
- 在父项目
CMakeLists.txt,我加了OPTION( ENABLE_PRINT "Enable Print" ON) - 然后,在示例子项目源文件夹
Config.h文件中,我添加了#define ENABLE_PRINT - 在位于示例子项目的
Config.h.in上,我添加了#cmakedefine ENABLE_PRINT - 最后,在源文件
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