Проблемы с компоновщиком с общей библиотекой в ​​macOS при использовании cmake - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть проект cmake, который создает общую библиотеку, которая в свою очередь ссылается на другие библиотеки: openssl, zlib, libevent и libevhtp.Мой проект прекрасно компилируется / компоновается в linux (он создает общие библиотеки, а также исполняемые файлы, связанные с моими библиотеками (тестовые сценарии)).

Однако в macOS я получаю неопределенные ссылки, когда библиотека связана:

[ 54%] Linking CXX shared library libmylib.dylib
Undefined symbols for architecture x86_64:
  "_RAND_bytes", referenced from:
      mylib::randomStringHex(int) in util.cc.o
  "_SSL_get_ex_data", referenced from:

(...more errors)

Теперь, если я добавлю это:

target_link_libraries(mylib PUBLIC ${EXTERNAL_LIBS})

(EXTERNAL_LIBS содержит все внешние ссылки на библиотеки), он успешно создаст общую библиотеку, и я могу использовать ее / ссылку наэто и все работает.Однако я не могу сохранить эту опцию, потому что в Linux я не могу связать свою библиотеку с libevhtp, потому что эта библиотека не скомпилирована с -fPIC.

Так что вопрос в том, нормально ли, что в macOS созданнаябиблиотека всегда будет ссылаться на внешние библиотеки, или как этого избежать?В его нынешнем виде я могу либо успешно работать на Linux или MacOS, но не на обеих платформах.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Вы можете использовать выражения генератора вместо переменных:

target_link_libraries(mylib PUBLIC
    $<$<PLATFORM_ID:Darwin>:libs_only_on_osx>
    $<$<PLATFORM_ID:Linux>:libs_only_on_linux>
    other_libs
)

Это может предотвратить ошибки при использовании переменных.

0 голосов
/ 16 февраля 2019

Динамические библиотеки linked, поэтому они должны быть связаны с их зависимостями.Если вам нужны разные флаги на Linux и Mac, просто добавьте условие к вашей переменной:

if(LINUX) 
    set(EXTERNAL_LIBS ...)
endif ()
if (APPLE)
    set(EXTERNAL_LIBS ...)
endif()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...