0

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

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

并且找到了 Eigen3,我的库编译没有任何问题。

当我在其他项目中使用我的库时会出现复杂情况。这个项目与 Eigen 无关,它没有在那里使用。但是,如果我在这个项目中也没有包含 Eigen 包含目录,那么它的编译就会失败。

我的库被编译为动态库,我猜它缺少一些 Eigen 的东西,这就是为什么项目也需要 Eigen 包含目录的原因。关于如何解决这个问题的任何想法?

谢谢你。

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

4

3 回答 3

2

Eigen 是一个只有头文件的库(除了一些 blas 绑定)。确保在使用库时不需要将 Eigen 作为构建时间依赖项的唯一方法是仅在库的源文件中包含 Eigen 标头,而在标头中不包含任何标头。这可能需要用PIMPL或类似的东西对 Eigen 类型和函数进行一些包装。

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

于 2014-05-07T09:35:30.470 回答
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 目标)。

于 2014-05-07T17:00:37.600 回答
0

正如@rubenvb 所说,Eigen 只是标题。但是,您可能还想提供一些模板功能,在这种情况下,您需要将 Eigen 添加到其他项目的包含目录中。此外,您可能在某些时候有其他依赖项根本无法像@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 文档。

于 2014-05-07T09:41:21.287 回答