Я пишу исполняемый файл, который использует 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,
, где
- список символов для экспорта (что-то вроде упрощенной версии файла .def). Но в таком случае создать общую библиотеку не так просто: компоновщик жалуется на неразрешенные символы.
Я попробовал взломать: переименовал исполняемый файл в lib
.dylib и, при компоновке разделяемого библиотеки, я передал -l <исполняемый файл>
. Но он выдает ошибку «не удается связать с основным исполняемым файлом».
Общая проблема заключается в том, что разделяемые библиотеки Linux могут иметь неразрешенные символы, в то время как Windows и Mac OS X не допускают этого. Но в Windows есть «библиотеки импорта» для сопоставления символов с зависимостями, а Mac OS X, по-видимому, не ...
Как это можно решить в Mac OS X? Есть ли эквивалент «библиотеки импорта» (библиотека-заглушка, созданная компоновщиком Windows при создании .dll, поэтому, если какой-либо модуль должен динамически связываться с .dll, он связывается с «библиотекой импорта»)? Или какое-то другое решение?