У меня есть внешняя библиотека здесь:
${PROJECT_SOURCE_DIR}/thirdparty/yaml-cpp/
Это сделано Makefile: thirdparty/Makefile
, Я выполняю этот make-файл так:
add_custom_target(
yaml-cpp
COMMAND make
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/thirdparty
)
Затем я пытаюсь связать библиотеку, которая создает thirdparty/yaml-cpp/build/libyaml-cpp.a
, Это та часть, которая не работает:
target_link_libraries(load_balancer_node ${CMAKE_SOURCE_DIR}/thirdparty/yaml-cpp/build/libyaml-cpp.a)
Я получаю ошибку:
Target "yaml-cpp" of type UTILITY may not be linked into another target.
One may link only to STATIC or SHARED libraries, or to executables with the
ENABLE_EXPORTS property set.
Как мне выполнить этот make-файл и связать .a
файл?
Поэтому имеет смысл, что cmake не может выяснить зависимости здесь: он должен был бы проанализировать make-файл и найти вывод. Вы должны сказать это кому-то на выходе. Насколько я понимаю, лучший способ сделать это — использовать команду custom_command, а не пользовательскую цель:
add_custom_command(
OUTPUT ${CMAKE_SOURCE_DIR}/thirdparty/yaml-cpp/build/libyaml-cpp.a
COMMAND make
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/thirdparty)
add_custom_target(
yaml-cpp
DEPENDS ${CMAKE_SOURCE_DIR}/thirdparty/yaml-cpp/build/libyaml-cpp.a)
...
add_dependencies(load_balancer_node yaml-cpp)
target_link_libraries(load_balancer_node ${CMAKE_SOURCE_DIR}/thirdparty/yaml-cpp/build/libyaml-cpp.a)
У меня были проблемы с компоновщиком (глупая машина с Windows), но cmake работал и создавал библиотеки, прежде чем пытаться связать.
Других решений пока нет …