『011』缺失某个链接库问题排查(library not found)
尝试从源码编译 tcc
, 但是发现编译之后的 tcc
编译其他代码总是会报错: tcc: error: library 'libtcc1.a' not found
. 也是花了很久时间才明白原因, 但是找原因的过程还是很有收获的。
编译期间执行的是 ./configure --prefix=./output
, 也就是把最后的 bin
、lib
等放入的是 ./output
文件夹中。 其中编译得出的 libtcc1.a
在 ./output/lib/tcc
中, 可执行文件 tcc
为 ./output/bin/tcc
.
现在进入 ./examples
文件夹下, 执行 ../output/bin/tcc ex1.c
, 发生上述错误。
1. 首先肯定是因为缺少链接库, 所以就看看编译时候的选项要求, 和 gcc
一样, -L dir
是用于指定链接库的文件夹的, 所以执行 ../output/bin/tcc ex1.c -L ../output/lib/tcc
, 但仍然报错。
2. 之后进行排查代码是否有问题:系统安装的 tcc
能否成功编译?可以。 使用其他版本代码进行编译得到的 tcc
能否编译?不可以。 所以是我自己编译 tcc
出现的问题。
3. 经过检查, 系统安装的 tcc
的链接库为 /usr/lib/tcc
, 所以执行 ../output/bin/tcc ex1.c -L /usr/lib/tcc
, 仍然报错。
4. 之后还不断尝试其他的选项, 全都失败.
5. 接着就是很关键的一步, 使用 strace 命令来进行排查!, 通过 strace
命令, 发现查找 libtcc1.a
这个链接库时始终从 ./output/lib/tcc
中这个路径中查找!!无论在哪一个目录下执行 /path/to/tcc demo.c
时都是如此!!
6. 因此就很明显地想到, 是编译期间使用的相对路径造成了问题!将 ./configure --prefix=./output
改为 ./configure --prefix=$PWD/output
, 最终执行 /path/to/tcc ex1.c
, 成功编译!