我正在尝试将一个功能添加为子库
现有的申请。但我遇到了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问题?
谢谢。
祝你好运, 胡大卫
答案 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