【发布时间】:2019-04-26 15:02:24
【问题描述】:
这可能是一个 x y 问题,所以这是我的情况。
背景
我的项目结构如下:
-project
-examples
-example_that_uses_mylib_1
* CMakeLists.txt
* main.cpp
-example_that_uses_mylib_2
* CMakeLists.txt
* main.cpp
-external
-notmylib_a
* CMakeLists.txt
* ... (other stuff)
-notmylib_b
* CMakeLists.txt
* ... (other stuff)
-src
-mylib_stuff
* file1.cpp
* file1.h
*CMakeLists.txt
CMakeLists.txt
我正在尝试制作一个执行以下操作的 cmake 文件:
-
允许
mylib依赖于在external中找到的第三方库中的目标,而不使用add_subdirectory,因为它们实际上不是子目录,这是不好的做法。 -
允许依赖于
mylib目标的example_that_uses_mylib可执行文件而不将其添加为子目录。
直到我看到 this project 的顶级 cmake 这样做之前,我不确定如何执行此操作:
add_subdirectory(lib/foo)
add_subdirectory(src/bar)
add_subdirectory(src/baz)
bar 和 baz CMakeLists.txt 这样做:
#Bar
find_package(foo 0.1.2 CONFIG REQUIRED)
#Baz
find_package(bar CONFIG REQUIRED)
这让我觉得我可以对我的图书馆做同样的事情。我做不到。
最初单一的顶级 CMakeLists.txt 构建了所有目标,我想摆脱它,并使用 add_subdirectories 拆分构建,从 mylib 开始。
问题
最初我的顶级 CMakeLists.txt 看起来很像这样(以前有效):
add_subdirectory(external/notmylib_a)
add_library(mylib STATIC src/mylib_stuff/file1.cpp)
target_include_directories(mylib PUBLIC src/)
target_link_libraries(mylib PRIVATE notmylib_a::notmylib_a)
当我决定将事情分开时,我最初是这样做的(这也有效):
#CMakeLists.txt
add_subdirectory(external/notmylib_a)
#src/CMakeLists.txt
add_library(mylib STATIC src/mylib_stuff/file1.cpp)
target_include_directories(mylib PUBLIC src/)
target_link_libraries(mylib PRIVATE notmylib_a::notmylib_a)
然后为了跟随另一个项目我决定这样做:
#CMakeLists.txt
add_subdirectory(external/notmylib_a)
#src/CMakeLists.txt
find_package(notmylib_a CONFIG REQUIRED) #NEW LINE!!
add_library(mylib STATIC src/mylib_stuff/file1.cpp)
target_include_directories(mylib PUBLIC src/)
target_link_libraries(mylib PRIVATE notmylib_a::notmylib_a)
我在 CMAKE 中遇到错误
CMake Error at src/CMakeLists.txt:25 (find_package):
Could not find a package configuration file provided by "notmylib_a"
with any of the following names:
notmylib_aConfig.cmake
notmylib_a-config.cmake
Add the installation prefix of "notmylib_a" to CMAKE_PREFIX_PATH or set
"notmylib_a_DIR" to a directory containing one of the above files. If
"notmylib_a" provides a separate development package or SDK, be sure it
has been installed.
其他项目如何以这种方式利用find_package?
【问题讨论】:
标签: c++ build cmake static-libraries target