Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 创建在运行时链接的动态库_C_Macos_Dynamic Linking - Fatal编程技术网

C 创建在运行时链接的动态库

C 创建在运行时链接的动态库,c,macos,dynamic-linking,C,Macos,Dynamic Linking,我正在尝试创建一个动态库,该库将在运行时链接并加载到主机环境中(例如,类似于Java中类加载的工作方式)。因此,我希望动态库留下一些“悬空”引用,我希望它在加载到宿主环境时能够从宿主环境中获取这些引用 我的问题是,如果不将动态库显式链接到现有符号,我就无法理解如何创建动态库。我希望生成一个动态库,它不依赖于特定的主机可执行文件(或主机库),而是能够在任何主机中加载(例如,通过dlopen)的动态库,只要主机提供两个可用符号 现在,我尝试过的任何链接命令都会导致丢失符号的投诉。我希望它允许符号丢失

我正在尝试创建一个动态库,该库将在运行时链接并加载到主机环境中(例如,类似于Java中类加载的工作方式)。因此,我希望动态库留下一些“悬空”引用,我希望它在加载到宿主环境时能够从宿主环境中获取这些引用

我的问题是,如果不将动态库显式链接到现有符号,我就无法理解如何创建动态库。我希望生成一个动态库,它不依赖于特定的主机可执行文件(或主机库),而是能够在任何主机中加载(例如,通过
dlopen
)的动态库,只要主机提供两个可用符号

现在,我尝试过的任何链接命令都会导致丢失符号的投诉。我希望它允许符号丢失(理想情况下,只是特别指定的符号)

例如,下面是一份在OS X上有错误的记录:

$ cat frotz.c 
void blort(void);

void run(void) {
    blort();
}

$ cc -c -o frotz.o frotz.c
$ cc -dynamiclib -o libfrotz.dylib frotz.o
Undefined symbols for architecture x86_64:
  "_blort", referenced from:
      _run in frotz.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
如果我使用GNU工具链(在Linux上)做同样的事情,它会告诉我:

$ gcc -shared -o libfrotz.so frotz.o
/usr/bin/ld: frotz.o: relocation R_X86_64_PC32 against undefined symbol `blort'
can not be used when making a shared object; recompile with -fPIC
事实上,将
-fPIC
添加到C compile命令似乎可以解决该环境中的问题。然而,它在OSX中似乎没有任何效果

我能在上面找到的所有其他动态链接问题似乎都是关于更常见的库的安排,在这种情况下,构建库是为了在可执行文件运行之前链接到可执行文件中,而不是反过来。我发现的最密切相关的问题是:

不幸的是,它的信息非常少,与我在这里提出的问题没有任何关系


更新:我从答案中提取了信息,还有我想的其他所有信息 将以下示例放在一起:


据我所知,您希望使用弱链接:

// mark function as weakly-linked
extern void foo() __attribute__((weak));

// inform the linker about that too
clang -dynamiclib -o bar.dylib bar.o -flat_namespace -undefined dynamic_lookup

如果在运行时可以解析弱函数,那么它将被解析。如果不能,它将是
NULL
,而不是生成运行时(或者,显然是链接时间)错误。

据我所知,您希望使用弱链接:

// mark function as weakly-linked
extern void foo() __attribute__((weak));

// inform the linker about that too
clang -dynamiclib -o bar.dylib bar.o -flat_namespace -undefined dynamic_lookup

如果在运行时可以解析弱函数,那么它将被解析。如果不能,它将是
NULL
,而不是生成运行时(或者,显然是链接时间)错误。

使用弱链接怎么样<代码>\uuuu属性((弱))或
\uuuu弱
或任何语法级别的内容,然后将
-flat\u namespace-undefined dynamic\u lookup
传递给链接器。我根本不知道
-undefined
选项。仅仅添加这一点似乎就满足了OSX链接器的要求。看起来GNU工具链可能会使用
ld-Ur
来表达同样的意思。如果你把你的评论扩展成一个答案,我肯定会投赞成票。使用弱链接怎么样<代码>\uuuu属性((弱))或
\uuuu弱
或任何语法级别的内容,然后将
-flat\u namespace-undefined dynamic\u lookup
传递给链接器。我根本不知道
-undefined
选项。仅仅添加这一点似乎就满足了OSX链接器的要求。看起来GNU工具链可能会使用
ld-Ur
来表达同样的意思。如果你把你的评论扩展成一个答案,我肯定会投赞成票。谢谢你提供关于弱链接的更多信息。在我的情况下,我很确定我希望它变成一个错误。@danfuzz然后只有1。检查
NULL
abort()
,或者只调用未选中的函数指针(在这种情况下,它很可能是segfault)。感谢提供有关弱链接的其他信息。在我的情况下,我很确定我希望它变成一个错误。@danfuzz然后只有1。检查
NULL
abort()
,或者只调用未选中的函数指针(在这种情况下,它很可能会出错)。