Подтвердить что ты не робот

Как я могу указать CMake искать библиотеки, установленные MacPorts?

Я пытаюсь создать часть нашего программного обеспечения, которое предназначено для работы исключительно на Linux, на MacOS X. Мы используем CMake, и я установил MacPorts, чтобы я мог легко получить CMake вместе с некоторыми из сторонних библиотек, которые мы зависим.

Теперь проблема заключается в том, что CMake по умолчанию не ищет библиотеки из MacPorts, поэтому некоторые из наших целей отключены, так как не удается найти зависимости, все из которых находятся в /opt/local.

Как я могу указать CMake также искать входящие и библиотеки из MacPorts?

4b9b3361

Ответ 1

Я добавил файл инструментальной привязки для "Дарвина", который добавляет необходимые пути ввода и библиотеки. Я надеялся на что-то более автоматическое, но, по крайней мере, оно решает проблему.

darwin.cmake:

SET(CMAKE_SYSTEM_NAME Darwin)

# Add MacPorts
INCLUDE_DIRECTORIES(/opt/local/include)
LINK_DIRECTORIES(/opt/local/lib)

Ответ 2

Добавьте /opt/local/lib и любые другие вероятные пути установки к набору путей, найденных cmake в вашем файле CMakeLists.txt:

set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} /opt/local/lib)

Это добавляет /opt/local/lib к набору путей, по которым cmake ищет библиотеки. Этот метод CMAKE_LIBRARY_PATH повлияет на все команды find_library после того, как вы установите переменную.

Для более хирургического подхода "библиотека за библиотекой" измените отдельные команды find_library:

find_library(Foo foo
    PATHS /opt/local/lib)

Обратите внимание, что это не делает hardcode/opt/local/lib единственным местом для поиска библиотеки. Скорее, он просто добавляет /opt/local/lib к множеству мест, в которых нужно искать библиотеку. Я часто заканчиваю тем, что добавляю много таких путей, покрывая места, наблюдаемые на всех машинах, о которых я знаю. См. документацию find_library, чтобы узнать больше об этой теме.

Вы также можете изменить CMAKE_INCLUDE_PATH, что повлияет на поведение команд find_file() и find_path().

Ответ 3

CMake должен уважать переменную среды DYLD_LIBRARY_PATH, которая эквивалентна переменной среды LD_LIBRARY_PATH в Linux. Ваш DYLD_LIBRARY_PATH должен иметь правильный путь для поиска библиотек, установленных MacPorts.

Ответ 4

Per @Nerdling "НЕ жестко" комментировать принятое решение, здесь предлагается определить путь префикса MacPorts.

MyModule.cmake

# Detect if the "port" command is valid on this system; if so, return full path
EXECUTE_PROCESS(COMMAND which port RESULT_VARIABLE DETECT_MACPORTS OUTPUT_VARIABLE MACPORTS_PREFIX ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)

IF (${DETECT_MACPORTS} EQUAL 0)
    # "/opt/local/bin/port" doesn't have libs, so we get the parent directory
    GET_FILENAME_COMPONENT(MACPORTS_PREFIX ${MACPORTS_PREFIX} DIRECTORY)

    # "/opt/local/bin" doesn't have libs, so we get the parent directory
    GET_FILENAME_COMPONENT(MACPORTS_PREFIX ${MACPORTS_PREFIX} DIRECTORY)

    # "/opt/local" is where MacPorts lives, add `/lib` suffix and link
    LINK_DIRECTORIES(${LINK DIRECTORIES} ${MACPORTS_PREFIX}/lib)

    MESSAGE("WINNING!: ${MACPORTS_PREFIX}/lib")
ENDIF()

# Recommendation, also add a "brew --prefix" custom command to detect a homebrew build environment

Ответ 5

Установите cmake и pkgconfig с MacPorts.

port install cmake pkgconfig

Файлы сборки CMake, использующие pkgconfig для поиска библиотек, затем будут использовать pkgconfig, установленный MacPorts, и, конечно, будут иметь правильные пути поиска для библиотек, установленных MacPorts.

Это предполагает, что файлы сборки CMake используют модуль FindPkgConfig. Например, у меня в проекте есть модуль FindLibuv.cmake, который начинается следующим образом.

find_package (PkgConfig)
pkg_check_modules (PC_Libuv QUIET libuv)