После переключения цели cwd_r
с (в проекте root 's CMakeLists.txt
)
pkg_check_modules(libcwd_r libcwd_r IMPORTED_TARGET GLOBAL)
на
find_package(libcwd_r CONFIG)
У меня неожиданно появляется ошибка для ранее работавший код (в events/CMakeLists.txt
):
add_executable(test1 test1.cxx)
target_link_libraries(test1 PRIVATE AICxx::events AICxx::utils AICxx::cwds)
раньше это работало нормально, и я хотел бы, чтобы он работал снова без того, чтобы мне пришлось изменить events/CMakeLists.txt
, что эти две строки являются часть.
Ошибка:
CMake Error at events/CMakeLists.txt:59 (add_executable):
Target "test1" links to target "Threads::Threads" but the target was not
found. Perhaps a find_package() call is missing for an IMPORTED target, or
an ALIAS target is missing?
Способ, которым сюда втягивается Threads::Threads
, заключается в том, что это зависимость PUBLI C от AICxx::cwds
.
Чтобы сузить круг, давайте сначала изменим вторую строку на
target_link_libraries(test1 PRIVATE AICxx::cwds)
, просто пропуская AICxx::events AICxx::utils
. Как и ожидалось, это дает точно такую же ошибку, потому что связывание еще не происходит.
Цель AICxx::cwds
определена в cwds/CMakeLists.txt
с
find_package(Threads REQUIRED)
[...snip...]
add_library(cwds_ObjLib OBJECT)
[...snip...]
# Add dependencies.
target_link_libraries(cwds_ObjLib
PUBLIC
Boost::boost
Threads::Threads
)
if (OptionEnableLibcwd)
target_link_libraries(cwds_ObjLib
PUBLIC
${libcwd_r_TARGET}
)
endif ()
# Create an ALIAS target.
add_library(AICxx::cwds ALIAS cwds_ObjLib)
, где OptionEnableLibcwd
истинно libcwd_r_TARGET
установлено на правильное целевое имя (Libcwd::cwd_r
) libcwd_r.
Обратите внимание, как cwds
добавляет зависимость от Threads::Threads
(и Boost). Но так как я изменил только то, как libcwd_r
найдено, что не может быть причиной проблемы, верно?
Чтобы проверить эту гипотезу - я также удалил Threads::Threads
из target_link_libraries
в этом cwds/CMakeLists.txt
и действительно все та же ошибка. Следовательно (как и ожидалось) он жалуется на что-то, что он унаследовал от Libcwd::cwd_r
.
Мой вопрос сейчас: если (найденная) цель Libcwd::cwd_r
задает зависимость Threads::Threads
, то почему я получаю эта ошибка? Разве это не должно быть скрыто от конечного пользователя (test1), который даже не знает, что используется Threads::Threads
(он просто связывается с AICxx::cwds
)? Ответ на это - Да! Потому что раньше, когда я использовал pkg_check_modules
, это работало!
Так что же изменилось? Что не так? Как я могу это исправить? И самое главное, что cmake ожидает от передачи таких зависимостей? Кажется, ошибка указывает на то, что я должен добавить find_package(Threads)
везде?!