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

CMake: Eigen3 include dirs needed from a third project

本文关键字:项目 三个 dirs Eigen3 包括第 CMake      更新时间:2023-10-16

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

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

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

当我在其他项目中使用我的库时,问题就出现了。这个项目与Eigen没有任何关系,它不在那里使用。但是,如果我没有在这个项目中包含Eigen include文件,它的编译就会失败。

我的库是作为一个动态库编译的,我猜其中缺少了一些Eigen的东西,这就是为什么项目也需要Eigen包含目录。知道怎么解决这个问题吗?

谢谢。

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

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

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

正如@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文档

如果你在你的头文件中包含了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还没有创建导入的目标)