-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[pybindings] Fix linking on Mac #13766
Conversation
@@ -32,7 +32,7 @@ omim_link_libraries( | |||
link_qt5_core(${PROJECT_NAME}) | |||
|
|||
if (PLATFORM_MAC) | |||
omim_link_libraries(${PROJECT_NAME} ${LIBZ}) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Линковка с libz - также избыточная (также странно, что нужна только на маке) - решается общим средством разрешения undefined символов.
Mac has different linker defaults than linux, and by default it does not allow undefined symbols to be left in resulting pybinding library. To allow it, we specifically pass linker argument when linking final pybinding object. This is done to avoid linking excessively to libpythonX.Y since at the time pybinding is loaded into Python process, all libpython symbols would be immediately available.
4122b00
to
28e5ba3
Compare
да, кажется -undefined вполне удобно использовать, но какие есть альтернативы dynamic_lookup? Что-то с ходу не нашел документацию на возможные значения. |
@vicpopov написал в личку, что ответ на мой вопрос уже есть в описании реквеста. |
а как dynamic_lookup работает? ищет во всех путях, которые есть в переменных окружения? |
Насколько я понимаю, это инструкция линкеру забить на разрешение всех символов ввиду обещания "они будут разрешены динамически в рантайме". Чем это отличается от опции suppress - не очень понимаю. |
Понял. dynamic_lookup типо значит не сейчас искать а потом, когда будет библиотека подключаться в исполняемый файл... Как это обычно и работает везде... Спасибо. |
может быть добавлять эти параметры линковщика не для каждой библиотеки, а всегда, если активирован режим сборки pybindings? В каком-то общем месте. |
Вообще да, но я не знаю как это сделать. Это надо будет сильно порефакторить cmake-файлы, нужен спец по этому. |
кажется, есть три варианта:
|
это из простого, что мне, как не особо разбирающемуся в этом человеку, пришло в голову. |
@mpimenov PTAL |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
Mac has different linker defaults than linux, and by default it
does not allow undefined symbols to be left in resulting pybinding
library.
To allow it, we specifically pass linker argument when linking final
pybinding object.
This is done to avoid linking excessively to libpythonX.Y since at the
time pybinding is loaded into Python process, all libpython symbols
would be immediately available.
Problem was introduced in #13695, after which all Mac pybindings builds were broken.
References:
Linux: https://linux.die.net/man/1/ld, section
MacOS: https://www.unix.com/man-page/osx/1/ld/, section
Somehow currently on Mac our linking is forced to be for flat namespace, and we can't avoid check for all symbols to be defined.
Option
-undefined dynamic_lookup
eases this check and allows linking to succeed.Alternative would be to try to use option
-bundle_loader
, but that might be much more complicated.