问题场景
一个静态链接库,.a文件。另有一个main.c,用到了库中的函数void a()。
编译的时候这样:
clang -Iinclude -Lbin -lzq main.c
提示找不到符号错误:
?
main.c:(.text+0x1a): undefined reference to `a'
用nm查看.a文件,能看到符号a。
解决方法
搜索了下,发现这个帖子:
差不多一样的问题。
原来是编译的时候参数顺序问题。因为是先指定的.a文件,连接器这时候没有看见main.o,它会认为库中的符号没有被用到,所以主动丢弃了。当后面需要链接main.o的时候就自然找不到符号了。
所以应该这样写:
clang main.c -Iinclude -Lbin -lzq
让链结器先发现main.o要使用的符号。
结论
潜规则,真是蛋疼。
?