На Linux я использую CMake (3.16.5) для связи в нескольких несистемных общих библиотеках, расположенных в разных каталогах. В этом примере макет каталога упрощен:
lib1:
libfoo.so
lib2:
libbar.so
Компиляция и компоновка приложения работает правильно, если один вызов target_link_libraries () со всеми целями или если find_library () использует уникальную переменную для хранения результаты передаются target_link_libraries (). Например:
#### foo lib
find_library(FOO_LIB_FOUND foo PATH ./lib1)
target_link_libraries(hello ${FOO_LIB_FOUND})
#### bar lib
find_library(BAR_LIB_FOUND bar PATH ./lib2)
target_link_libraries(hello ${BAR_LIB_FOUND})
Однако неразрешенная ссылка на libbar.so возникает при использовании той же переменной в find_library (), которая в конечном итоге передается target_link_libraries (). Например:
#### foo lib
find_library(**LIB_FOUND** foo PATH ./lib1)
target_link_libraries(hello ${**LIB_FOUND**})
#### bar lib
find_library(**LIB_FOUND** bar PATH ./lib2)
target_link_libraries(hello ${**LIB_FOUND**})
find_library () фактически указывает на то, что она найдена в lib1. Согласно CMake, «Повторные вызовы для одних и тех же« целевых »элементов добавляются в порядке вызова». Я даже пытался использовать функцию / подпрограмму, но та же проблема.
function(SIMPLE arg1 arg2 arg3)
find_library(LIB_FOUND ${arg1} PATH ${arg2})
target_link_libraries(${arg3} ${LIB_FOUND})
endfunction()
SIMPLE(foo ./lib1 hello)
SIMPLE(bar ./lib2 hello)
В конечном счете, я надеюсь сделать эту последовательность find_library / target_link_libraries в FOREACH l oop, так как у меня будет много библиотек и путей найти динамически.