gpt4 book ai didi

c - 链接到 OSX 上的可执行文件

转载 作者:行者123 更新时间:2023-12-05 06:34:44 26 4
gpt4 key购买 nike

在 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

共享:

> gcc ext.c -shared -o ext.so

我无法让它们工作,一方面是因为 undefined symbol ,另一方面是无法加载带有 -l 标志的可执行文件。

我可以让他们使用 -undefined dynamic_lookup 在运行时解析 undefined symbol 。但这不是一种可持续的方式,因为所有链接错误现在都发生在运行时。

当链接为 -shared-dynamiclib 时,有没有办法提供符号列表以从可执行文件动态加载?

最佳答案

是的,这是可能的,但是您需要创建一个bundle 而不是共享库(更多详细信息请参见this answer)。

如果你有一个像这样的主应用程序:

#include <stdio.h>
#include <dlfcn.h>

int func(void)
{
return 42;
}

int main(void)
{
void *dl = dlopen("plugin.so", RTLD_LOCAL);
if(!dl) return -1;

int (*derp)(void) = dlsym(dl, "derp");
if(!derp) return -1;

printf("derp(): %i\n", derp());

return 0;
}
clang -o main main.c -Wall -Wl,-export_dynamic

然后你可以像这样编译包:

int func(void);

int derp(void)
{
return -func();
}
clang -o plugin.so plugin.c -Wall -bundle -bundle_loader ./main

关于c - 链接到 OSX 上的可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50132527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com