如何构建库在CMakeList中相互依赖

时间:2015-10-18 14:27:05

标签: cmake

在项目的根目录中,有两个库文件夹,一个是lib1,另一个是lib2。

在lib1文件夹中,有以下文件:

lib1Config.cmake.in + lib1ConfigVersion.cmake.in + CMakeList.txt

在lib2文件夹中,有以下文件:

lib2Config.cmake.in + lib2ConfigVersion.cmake.in + CMakeList.txt

在lib2中,CMakeList.txt包含FIND_PACKAGE(lib1 REQUIRED)。当我尝试在根目录中运行cmake,它只是简单地调用add_subdirectory(lib1)和add_subdirectory(lib2)时,lib2中的CMakeList.txt抱怨它找不到lib1Config.cmake。然后,我的问题是:我如何进行适当的调整才能使其发挥作用。

仅供参考:这里,lib1实际上是osgworks,lib2是osgbullet。我试图将它们包含在我的项目的lib文件夹中。有可能吗?

1 个答案:

答案 0 :(得分:0)

这里的问题是osgBullet尝试在osgWorks上使用find_package但osgWorks尚未在osgBullet配置的时候构建和安装。

这可以通过这些行(在osgBullet和项目中)修复

if(NOT TARGET <some-osgWorks-target)
    find_package(osgWorks REQUIRED)
endif()
...
if(TARGET <some-osgWorks-target)
    target_link_libraries(<my-project> <osgWorks-targets>...)
else()
    target_link_libraries(<my-project> ${OSGWORKS_LIBRARIES})
endif()

但我想说,最好不要在项目中包含 osgworks osgbullet 。它们是外部依赖项,先决条件。让您项目的CMakeLists.txt(以及生成的IDE或文本编辑器项目)仅包含您当前正在处理的目标。

在配置项目之前,您需要构建并安装 osgworks osgbullet 。这可以手动完成,也可以为此编写一个小的shell脚本。可能的实施:

cmake -H<osgWorks-source> -Bb/osgworks -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=$PWD/install \
    -DCMAKE_PREFIX_PATH=<other-deps-install-dirs>
cmake --build b/osgworks --target install
cmake -H<osgBullet-source> -Bb/osgbullet -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=$PWD/install \
    "-DCMAKE_PREFIX_PATH=$PWD/install;<other-deps-install-dirs>"
cmake --build b/osgbullet --target install

如果您使用的是Visual Studio或Xcode,则需要在--config Release行而不是cmake --build中使用CMAKE_BUILD_TYPE设置配置。

之后,您可以配置自己的项目:

cmake -H<my-source> -Bb -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=$PWD/install \
    "-DCMAKE_PREFIX_PATH=$PWD/install;<other-deps-install-dirs>"