昨天在Debian11 上编译 bluez 的时候,看这里,出现了如下这个错误,一般这种未定义的错误提示都是没有链接正确的库导致,但是搞了很久都没解决。
奇怪的是之前在 Centos 上编译却没有遇到这个问题,而且在 configure 时也是添加了 -lreadline -lncurses
生成的 Makefile 里也有有了这个对应的设置
一开始怀疑是不是编译的时候这个选项没加进去,所以我就在错误指示的那一行:make[3]: *** [Makefile:3992: client/bluetoothctl] Error 1
添加了一下打印:
同时把bluez.mk 里的./configure 那一行注释掉,这样不再重新生成新的Makefile,否则上面这一行就白加了,结果如下,能看到有链接的库目录,以及链接哪些库:
然后看到Makefile 里它后面还跟了 $(LIB) 这个变量,那也打印了一下这个变量是什么:
这个LIB 是空的,于是我只是想尝试一下直接在这个Makefile 里添加连接库,如下:
结果那个错误编译过去了,只是还有其他地方也是这样的错误:
那说明 configure 里的 LDFLAGS 并不能设置链接哪些库,而应该只是设置路径的,我们应该用 LIBS,所以修改成这样:
最后编译成功,完美解决
而且在查看 configure -help 帮助的时候,其实它已经说明了这两个环境变量的用法:
思考:其实从在 LDFLAGS 里添加链接库名称,这样看来也不合理,因为链接库应该是放在编译选项的最后,若放到要编译的对象(即.o文件)前,那之后的对象在链接的时候肯定是找不到对应符号的。 但如果在生成 Makefile 的时候,这个变量放到编译选项的最后应该也可以编译成功,之前在 Centos 编译成功难道是这样的,现在也不想去验证了。看来在执行 configure 前还是需要看一下 help 了。