Связывание не работает в cmake доморощенного со времен Мохаве - PullRequest
0 голосов
/ 07 января 2019

Я воспроизвел этот симптом на двух компьютерах сейчас, cmake, похоже, больше не ищет в /usr/local/lib (или, точнее, $(brew --prefix)/lib) для библиотек, предоставленных Homebrew, после обновления моей машины до macOS Mojave.

Хотя есть способы обойти это (например, поиск доморощенного префикса с использованием EXECUTE_PROCESS; добавить результат в команду LINK_LIBRARIES(...)), ни один из них не идеален. Что изменилось в Мохаве, чтобы нарушить это поведение?

Временное решение заключается в добавлении следующего к CMakeLists.txt:

# WARNING: Don't hard-code this path
LINK_DIRECTORIES(/usr/local/lib)

Я уже попробовал brew doctor и обновил все пакеты homebrew безрезультатно.

Конкретная ошибка, которую показывает cmake (make):

ld: library not found for -l<somelib>

Я задал вопрос на форумах Homebrew и Форумы разработчиков Apple .

Ответы [ 2 ]

0 голосов
/ 13 июля 2019

Обнаружена связанная (?) Проблема при попытке pip install psycopg2 в приложении Django под OS X Mojave (10.14). Я получаю следующие ошибки:

ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command 'clang' failed with exit status 1

Краткое объяснение: «Начиная с Высокой Сьерры, / usr / local больше не существует способный к ... »

Решение: изменить разрешения для / usr / local, чтобы Homebrew мог создать ссылки .

Я адаптировал решение под свои нужды. Тогда я наконец смог запустить pip install psycopg2. Вот последовательность команд.

Первый

sudo chown -R $(whoami) $(brew --prefix)/*

Тогда

brew reinstall openssl
export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"
pip install psycopg2
0 голосов
/ 09 января 2019

Я выделил это для следующего изменения в журналах VERBOSE=1 make ...

  • Высшая Сьерра (<= 10.13) и ниже <strong>НЕ использовали команду -isysroot.
  • Мохаве (> = 10,14) DOES использует команду -isysroot.

С gnu.org :

-isysroot <dir> Эта опция аналогична опции --sysroot, но применяется только к заголовочным файлам ( за исключением целей Дарвина, где она применяется как к заголовочным файлам, так и к библиотекам ). См. Параметр --sysroot для получения дополнительной информации.

Таким образом, этот флаг специально перекрывает путь поиска lib только в Apple. Это приводит к тому, что компиляция никогда не смотрит в стандартные ld местоположения, что можно увидеть, набрав ld -v dummy.

Library search paths:
    /usr/lib
    /usr/local/lib

Почему cmake делает это? Я думал, что это было для исправления /usr/local/include проблем , представленных в новом поведении Mojave SDK.

К сожалению, я не могу найти флаг компиляции cmake для добавления путей поиска библиотеки по умолчанию обратно. На данный момент единственное решение, которое я нашел, это добавить следующее в мой проект:

IF(APPLE)
    # Fix linking on 10.14+. See https://stackoverflow.com/questions/54068035
    LINK_DIRECTORIES(/usr/local/lib)
ENDIF()

Я не уверен, что такое поведение оправдывает вышестоящий патч cmake. Если есть лучшее решение, пожалуйста, предоставьте его.

...