В Windows можно динамически связывать исполняемый файл с экспортированными символами. Например, следующий код:
// main.c
void __declspec(dllexport) interface_function() {}
int main() {}
// ext.c
void interface_function();
void extension_function() {
interface_function();
}
С
cl.exe main.c
cl.exe ext.c / LD / link main.lib
создаст исполняемый файл main.exe
, статическую библиотеку main.lib
для неявного связывания и динамическую библиотеку ext.dll
.
Подобное поведение может быть достигнуто в OSX с общими библиотеками:
// main.c
void interface_function() {}
int main() {}
// ext.c
void interface_function();
void extension_function() {
interface_function();
}
С
gcc main.c -o main
gcc ext.c -bundle -bundle_loader main -o ext.bundle
это практически эквивалентно настройке Windows.
Но для dynamiclib
:
> gcc ext.c -dynamiclib -o ext.dylib
и shared
:
> gcc ext.c -shared -o ext.so
Я не могу заставить их работать из-за неопределенных символов с одной стороны и неспособности загрузить исполняемый файл с флагом -l
с другой.
Я могу позволить им разрешать неопределенные символы во время выполнения с -undefined dynamic_lookup
. Но это не является устойчивым способом, потому что все ошибки связи теперь происходят во время выполнения.
Есть ли способ предоставить список символов для динамической загрузки из исполняемого файла при связывании как -shared
и -dynamiclib
?