我实现了一个使用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。
答案 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目标)。