确保重新编译时处理定义

Posted

技术标签:

【中文标题】确保重新编译时处理定义【英文标题】:Ensure define is processed when recompiling 【发布时间】:2016-06-02 14:11:48 【问题描述】:

我正在使用 Eigen 开发一个 c++ 项目。 最近我使用此处描述的推荐方式向 Eigen MatrixBase 添加了一个函数:

https://eigen.tuxfamily.org/dox/TopicCustomizingEigen.html

此网页说明如何在名为 MatrixBaseAddons.h 的新文件中添加新的特征函数。然后它要求定义 EIGEN_MATRIXBASE_PLUGIN

然后可以在 config.h 或他的项目的任何先决条件头文件中添加以下声明:

#define EIGEN_MATRIXBASE_PLUGIN "MatrixBaseAddons.h"

这是困扰我的部分...我没有创建我正在从事的项目并且是 CMake 的新手。我在我们的项目中没有看到 config.h 文件,也不知道在哪里添加上面的定义以确保始终定义 EIGEN_MATRIXBASE_PLUGIN。

在使用 CMake 的 c++ 项目中,我们如何查看/更改文件的编译顺序?我应该把这条线放在哪里

#define EIGEN_MATRIXBASE_PLUGIN "MatrixBaseAddons.h"

确保它总是被定义?

【问题讨论】:

听起来关键短语是“他的项目的任何先决条件头文件”。 只是想知道为什么他们应该更喜欢这种方法而不是继承...... 显然,MatrixBase 支持许多不同的类型和功能,我想通过覆盖基类可能会破坏某些东西。我不知道您是否看过我问题中的链接:文档明确指定:Before inheriting from Matrix, be really, i mean REALLY sure that using EIGEN_MATRIX_PLUGIN is not what you really want 所以我选择了第一个选项 【参考方案1】:

尝试在您的 CMakeLists 中添加以下行:

add_definitions(-DEIGEN_MATRIXBASE_PLUGIN="MatrixBaseAddons.h")

这会将您的定义添加到您的编译器命令行中。更多信息CMake add_definitions page

【讨论】:

以上是关于确保重新编译时处理定义的主要内容,如果未能解决你的问题,请参考以下文章

RStan 卡在“哈希不匹配所以重新编译”确保 Stan 代码以空行结尾

重新编译使用CMake的旧项目的问题处理

由于多个重新定义错误,CUDA 样本无法编译

是否可以拆分 SWIG 模块进行编译,但在链接时重新加入?

如何防止SBT重新编译修改后的.class文件?

为啥我在写C语言的头文件,编译时会出现重新定义变量的情况?