Я пишу исполняемый файл, который использует dlopen () (LoadLibrary () в Windows) для динамической загрузки общей библиотеки. Общая библиотека использует символы из исполняемого файла.
В Windows это возможно. Исполняемые файлы могут экспортировать символы: файлы declspec (dllexport) и .def оба работают. Компоновщик при создании .exe также создает файл .lib («библиотека импорта»), поэтому DLL просто нужно связать с этим .lib.
В Linux это также возможно. Я передаю -Wl, -export_dynamic при сборке исполняемого файла, чтобы он экспортировал свои символы.
Вместо этого в Mac OS X ... -Wl, -export_dynamic не работает, но есть -Wl, -exported_symbols_list, <filename>
где <filename>
- список символов для экспорта (что-то более простое версия файла .def). Но тогда создание общей библиотеки не так просто: компоновщик жалуется на неразрешенные символы.
Я попробовал взломать: переименовал исполняемый файл в lib <executable>
.dylib и, когда связывал разделяемую библиотеку, передал -l <executable>
. Но выдает ошибку «не удается связать с основным исполняемым файлом».
Общая проблема заключается в том, что совместно используемые библиотеки Linux могут содержать неразрешенные символы, в то время как Windows и Mac OS X не допускают этого. Но в Windows есть «библиотеки импорта» для разрешения символов по отношению к зависимостям, а в Mac OS X, по-видимому, нет ...
Как это можно решить в Mac OS X? Есть ли эквивалент «библиотеки импорта» (библиотека-заглушка, созданная компоновщиком Windows при создании DLL, поэтому, если какой-либо модуль должен динамически связываться с DLL, он связан с «библиотекой импорта»)? Или другое решение?