Как добавить путь к библиотеке в cmake?
У меня есть 2 папки "inc" и "lib" в моем проекте, которые имеют соответственно заголовки и статические библиотеки. Как мне сказать cmake использовать эти 2 директории для include и linking соответственно?
3 ответа
Самый простой способ сделать это было бы добавить
include_directories(${CMAKE_SOURCE_DIR}/inc)
link_directories(${CMAKE_SOURCE_DIR}/lib)
add_executable(foo ${FOO_SRCS})
target_link_libraries(foo bar) # libbar.so is found in ${CMAKE_SOURCE_DIR}/lib
Современная версия CMake, которая не добавляет -I and -L
флаги для каждого вызова компилятора будут использовать импортированные библиотеки:
add_library(bar SHARED IMPORTED) # or STATIC instead of SHARED
set_target_properties(bar PROPERTIES
IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/lib/libbar.so"
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/include/libbar"
)
set(FOO_SRCS "foo.cpp")
add_executable(foo ${FOO_SRCS})
target_link_libraries(foo bar) # also adds the required include path
Если настройка INTERFACE_INCLUDE_DIRECTORIES
не добавляет путь, более старые версии CMake также позволяют использовать target_include_directories(bar PUBLIC /path/to/include)
, Однако это больше не работает с CMake 3.6 или новее.
Вам лучше использовать команду find_library вместо link_directories. Конкретно говоря, есть два пути:
указать путь внутри команды
find_library(ИМЯ gtest ПУТИ path1 path2 ... pathN)
установить переменную CMAKE_LIBRARY_PATH
set(CMAKE_LIBRARY_PATH path1 path2)
find_library(NAMES gtest)
причина в том, что течет :
Примечание. Эта команда требуется редко, и ее следует избегать, если есть другие варианты. По возможности предпочтительнее передавать полные абсолютные пути к библиотекам, так как это гарантирует, что правильная библиотека всегда будет связана. Команда find_library() предоставляет полный путь, который обычно можно использовать непосредственно при вызове target_link_libraries(). Ситуации, в которых может потребоваться путь поиска библиотеки, включают: Генераторы проектов, такие как Xcode, где пользователь может переключать целевую архитектуру во время сборки, но нельзя использовать полный путь к библиотеке, поскольку она предоставляет только одну архитектуру (т. е. это не универсальный двоичный файл). ).
Библиотеки сами по себе могут иметь другие зависимые частные библиотеки, которые должны быть найдены с помощью механизмов RPATH, но некоторые компоновщики не могут полностью декодировать эти пути (например, из-за наличия таких вещей, как $ORIGIN).
Если необходимо указать путь поиска библиотеки, предпочтительнее локализовать эффект, где это возможно, с помощью команды target_link_directories(), а не link_directories(). Целевая команда также может управлять тем, как каталоги поиска распространяются на другие зависимые цели.
Может не работать с link_directories, затем добавьте каждую статическую библиотеку, как показано ниже:
target_link_libraries(foo /path_to_static_library/libbar.a)