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

C 向libbluray添加函数时未定义的引用,c,makefile,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[])

将函数添加到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'
索引_dump.c仅包括

#include <stdio.h>
#include "bluray.h"
#包括
#包括“bluray.h”
这太令人困惑了


另外,
fgrep do_stuff.libs/libbluay.so
显示
do_stuff
在对象文件中

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

因此,仅从库中导出以
bd\uu
开头的符号。符号
do_stuff
与此正则表达式不匹配,因此它不会导出并在库外部可见


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

将函数添加到源代码后是否重新编译库?如果没有,那就是问题所在。如果它位于本地
.libs
目录中,则是您正在链接的库,还是您实际正在链接已安装的库(可能没有定义符号);非常感谢。关于为什么他们会选择这样做而不是声明它们是静态的,有什么想法吗?使用
static
,他们必须将所有内容都放在一个翻译单元(C源文件)中。
libbluray_la_LDFLAGS= -no-undefined -version-info $(LT_VERSION_INFO) \
  -export-symbols-regex "^bd_"