Это может быть проблемой xy, так что вот моя ситуация.
Фон
У меня есть следующая структура проекта:
-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
, учитывая, что они на самом деле не являются подкаталогами, и это плохая практика.
позволяет example_that_uses_mylib
исполняемым файлам, которые зависят от цели mylib
, без добавления ее в качестве подкаталога.
Я не был уверен, как это сделать, пока не увидел этот проект , чей 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
таким образом?