CMake:Eigen3包括第三个项目所需的dirs

时间:2014-05-07 09:32:01

标签: c++ cmake eigen3

我实现了一个使用Eigen3的库。以下行是此库的CMake的一部分:

#EIGEN
find_package(Eigen3 REQUIRED) 
include_directories(${EIGEN3_INCLUDE_DIR})

找到了Eigen3,我的图书馆编译没有任何问题。

当我在其他项目中使用我的库时会出现复杂情况。这个项目与Eigen无关,它不在那里使用。但是,如果我不在此项目中包含Eigen include dirs,则其编译失败。

我的库被编译为动态库,我想其中缺少一些Eigen的东西,这就是为什么项目需要Eigen包含目录的原因。有关如何解决此问题的想法吗?

谢谢。

PS:我在Ubuntu 13.04并使用QtCreator作为IDE。

3 个答案:

答案 0 :(得分:2)

Eigen是一个仅头文件库(除了一些blas绑定)。在使用库时,确保Eigen不需要作为构建时依赖性的唯一方法是仅在库的源文件中包含Eigen头,而在头中不包含。这可能需要用PIMPL或其他一些包装特征类型和函数。

如果已经是这种情况,那么您的问题就是缺少信息。

答案 1 :(得分:0)

正如@rubenvb所说,Eigen只是标题。但是,您可能还想提供一些模板函数,在这种情况下,您需要将Eigen添加到其他项目的include目录中。此外,您可能在某些方面有其他依赖关系,根据@rubenvb建议无法隐藏。但别担心!对于CMake项目,如果为库生成pkg-config文件,则只需使用:

find_package(PkgConfig)
pkg_check_modules(YourLib REQUIRED yourlib)
include_directories(${YourLib_INCLUDE_DIRS})

因此,这对用户来说是透明的。任何其他依赖项也将同时处理。请注意,库和定义也是可用的。这些都在pkg_check_modules的CMake文档中进行了解释。

在ROS节点的特殊情况下(您在编辑之前询问过),当您声明您的库是ROS节点的依赖项时,这些包含也可以使用catkin自动完成。有关更多信息,请查看catkin文档。

答案 2 :(得分:0)

如果在标题中包含Eigen标题,那么Eigen是项目的公共依赖项。

http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html

另见

http://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html

(尽管Eigen尚未创建IMPORTED目标)。