Как добавить путь к библиотеке в 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. Конкретно говоря, есть два пути:

  1. указать путь внутри команды

    find_library(ИМЯ gtest ПУТИ path1 path2 ... pathN)

  2. установить переменную 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)
Другие вопросы по тегам