【问题标题】:How to build libraries depend on each other in CMakeList如何在 CMakeList 中构建库相互依赖
【发布时间】:2016-01-16 21:29:42
【问题描述】:

在一个项目的根目录下,有两个libraries文件夹,一个是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 文件夹中。有可能吗?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    这里的问题是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()
    

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

    在配置项目之前,您需要构建和安装 osgworksosgbullet。这可以手动完成,也可以为此编写一个小的 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,则需要在 cmake --build 行中使用 --config Release 而不是 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>"
    

    【讨论】:

    • 那么,我应该将什么样的库放入项目的 lib 文件夹中。我不知道这里的区别。
    • by
    • 阅读配置模块 我认为 osgWorks 创建了这些目标:osgwTools、osgwQuery、osgwMx 和 osgwControls。所以其中任何一个都可以用来检查osgWorks是否添加了add_subdirectory
    猜你喜欢
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2021-08-25
    相关资源
    最近更新 更多