在将函数添加到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
在目标文件中。
答案 0 :(得分:0)
Makefile.am
包含以下内容(包装在此处):
libbluray_la_LDFLAGS= -no-undefined -version-info $(LT_VERSION_INFO) \
-export-symbols-regex "^bd_"
结果,仅从库中导出以bd_
开头的符号。符号do_stuff
与该正则表达式不匹配,因此不会导出并且在库外部不可见。
您的fgrep
检查可能是从调试信息或常规符号表(.symtab
,而不是.dynsym
中的动态符号表)中选择了符号名称。