向libbluray添加函数时未定义的引用

时间:2019-03-17 02:04:34

标签: c makefile

在将函数添加到libbluray并在包含的示例中进行测试时,make仅为添加的函数生成“未定义的引用”,标题中的其他函数也可以正常工作。

确切的变化如下:

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'

index_dump.c仅包含

#include <stdio.h>
#include "bluray.h"

这是如此令人困惑。

此外,fgrep do_stuff .libs/libbluray.so显示do_stuff在目标文件中。

1 个答案:

答案 0 :(得分:0)

libbluray中的

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

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

结果,仅从库中导出以bd_开头的符号。符号do_stuff与该正则表达式不匹配,因此不会导出并且在库外部不可见。

您的fgrep检查可能是从调试信息或常规符号表(.symtab,而不是.dynsym中的动态符号表)中选择了符号名称。