当顶级CMakeLists.txt调用install时,无法在子目录中构建库(EXPORT)

时间:2018-03-13 11:07:52

标签: cmake

我正在尝试将一个功能添加为子库 现有的申请。但我遇到了install(EXPORT ...)

的麻烦

我的项目源代码结构如下所示:

app (the existing application)
     |-- top-level CMakeLists.txt
     |
     |-- sublib (my new feature)
     |        |-- src
     |        |-- include
     |        `-- CMakeLists.txt
     |
     |-- other existing src ...

我在自己的功能中的 CMakeLists.txt 中构建了 sublib

add_library(sublib ${LIB_SRC})

我将现有应用程序中的顶级 CMakeLists.txt 修改为 链接 sublib

add_subdirectory(subdirectory of sublib)
...
target_link_directories(app sublib)

我认为这就够了。但是CMake抛出了一个错误:

  

CMake错误:安装(EXPORT“appTargets”...)包含目标“app”   这需要目标“sublib”不在导出集中。

我想这是因为 app 本身是由install(EXPORT .. )导出的 顶级 CMakeLists.txt 。因此,我还尝试安装和导出 sublib 。 我将安装和导出添加到 sublib CMakeLists.txt

install(TARGETS sublib
    EXPORT  sublibTargets
    ARCHIVE DESTINATION ${BIN_INSTALL_DIR}
    LIBRARY DESTINATION ${LIB_INSTALL_DIR}
    RUNTIME DESTINATION ${LIB_INSTALL_DIR}
    )

install(EXPORT sublibTargets
    FILE sublib-config.cmake
    DESTINATION ${LIB_INSTALL_DIR}/cmake/sublib
    )

然后我在顶级 CMakeLists.txt 中添加find_package()

find_package(sublib REQUIRED)
target_link_directories(app sublib)

然而,情况变得更糟。根本没有构建 sublib 找不到 sublib-config.cmake 。 我在PATHS中手动将find_package()设置为 sublib-config.cmake 但它仍然失败。

您能否告诉我如何修复EXPORT问题?

谢谢。

祝你好运, 胡大卫

2 个答案:

答案 0 :(得分:0)

您不必在顶层enter code here中致电find_package(sublib),这是为了安装后使用CMakeLists.txt的项目使用。由于您在sublib中致电add_subdirectory(sublib),因此目标CMakeLists.txt已在您致电sublib的地方使用。

答案 1 :(得分:0)

我试着自己回答。我受@piwi的启发。

如果 sublib 作为子目录放在 app 下, sublib 源代码应与的源代码一起构建应用,而不是将 sublib 视为独立库。无需导出 sublib

仅当 sublib 作为独立库放置时,才需要导出和安装 sublib 。在 sublib CMakeLists.txt 中导出并安装 sublib 。在应用的cmake/modules下放置 Findsublib.cmake 。因此,稍后当应用 CMakeLists.txt 致电find_package(sublib)时,Findsublib.cmake会告诉 app 如何查找 sublib 并构建或链接 sublib