将函数添加到libbluray并在包含的示例中测试它时,make只为添加的函数生成“未定义的引用”,header中的其他函数工作正常。
确切的变化如下:

src/libbluray/bluray.c:

+void do_stuff()
+{
+    //nothing
+}

src/libbluray/bluray.h:

+void do_stuff(void);

src/examples/index_dump.c:
int main(int argc, const char *argv[])
 {
+
+    do_stuff();
+

出错:
/usr/bin/ld: src/examples/index_dump.o: in function `main':
.../libbluray/src/examples/index_dump.c:66: undefined reference to `do_stuff'

索引转储.c仅包括
#include <stdio.h>
#include "bluray.h"

这太让人困惑了。
此外,fgrep do_stuff .libs/libbluray.so还显示do_stuff在对象文件中。

最佳答案

libbluray中的Makefile.am包含以下内容(包装在此处):

libbluray_la_LDFLAGS= -no-undefined -version-info $(LT_VERSION_INFO) \
  -export-symbols-regex "^bd_"

因此,仅从库中导出以bd_开头的符号。符号do_stuff与此正则表达式不匹配,因此它不会导出并在库外部可见。
您的fgrep检查可能从调试信息或常规符号表(.symtab,而不是.dynsym中的动态符号表)中获取符号名。

关于c - 向libbluray添加功能时 undefined reference ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55203233/

10-11 03:42