我的目标是在cmake(3.0.2)中包含Eigen3(3.2.2)插件,并在代码中使用它们。
我尝试使用add_definitions()
设置编译器定义,但似乎未包含在标头中。据cmake文档了解,编译器定义仅在源文件中“可见”,因此在标头中不可见。
这是我要包含在适当的.cmake
中的CMakeLists.txt
文件。
set(EIGEN_FUNCTORS_PLUGIN_PATH "grid_map_core/eigen_plugins/FunctorsPlugin.hpp")
if (EIGEN_FUNCTORS_PLUGIN)
if (NOT EIGEN_FUNCTORS_PLUGIN STREQUAL EIGEN_FUNCTORS_PLUGIN_PATH)
MESSAGE(FATAL_ERROR "EIGEN_FUNCTORS_PLUGIN already defined!")
endif ()
else (EIGEN_FUNCTORS_PLUGIN)
add_definitions(-DEIGEN_FUNCTORS_PLUGIN=\"${EIGEN_FUNCTORS_PLUGIN_PATH}\")
endif (EIGEN_FUNCTORS_PLUGIN)
set(EIGEN_DENSEBASE_PLUGIN_PATH "grid_map_core/eigen_plugins/DenseBasePlugin.hpp")
if (EIGEN_DENSEBASE_PLUGIN)
if (NOT EIGEN_DENSEBASE_PLUGIN STREQUAL EIGEN_DENSEBASE_PLUGIN_PATH)
MESSAGE(FATAL_ERROR "EIGEN_DENSEBASE_PLUGIN already defined!")
endif ()
else (EIGEN_DENSEBASE_PLUGIN)
add_definitions(-DEIGEN_DENSEBASE_PLUGIN=\"${EIGEN_DENSEBASE_PLUGIN_PATH}\")
endif (EIGEN_DENSEBASE_PLUGIN)
仅使用这些add_definitions()
语句,编译器会给出一个错误,即找不到插件方法,因此在头文件中找不到定义,因为eigen在类的声明中包含了插件文件。
如果我在要直接使用插件的类中定义宏,如下所示,编译成功。
#define EIGEN_DENSEBASE_PLUGIN "grid_map_core/eigen_plugins/DenseBasePlugin.hpp"
#define EIGEN_FUNCTORS_PLUGIN "grid_map_core/eigen_plugins/FunctorsPlugin.hpp"
完整的代码可以在我的github仓库中找到:https://github.com/BeatScherrer/grid_map/
我的问题是cmake中是否有一种方法不仅可以为.src
文件定义编译定义,还可以为标头定义编译定义,因此我可以直接在cmake中设置本征插件,而不是为此相当难看的手动定义。< / p>
很有趣:如果您使用catkin构建原始库,则不会出现此类错误,而且我不太确定自己缺少什么。