在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 -dynamiclib -undefined dynamic_lookup -o ext.dylib
这与Windows设置几乎相同。
但对于dynamiclib
:
> gcc ext.c -dynamiclib -o ext.dylib
并且共享
:
> gcc ext.c -shared -o ext.so
由于一方面存在未定义的符号以及另一方面无法使用-l
标志加载可执行文件,因此我无法让它们正常工作。
我可以使用-undefined dynamic_lookup
让它们在运行时解决未定义的符号。但这种方式并不可持续,因为所有的链接错误现在都会在运行时发生。
是否有一种方法可以在链接为-shared
和-dynamiclib
时提供要动态加载的符号列表?
-Wl,-export_dynamic
。 - Lorinczy Zsigmond