Skip to content

『011』缺失某个链接库问题排查(library not found)

尝试从源码编译 tcc, 但是发现编译之后的 tcc 编译其他代码总是会报错: tcc: error: library 'libtcc1.a' not found. 也是花了很久时间才明白原因, 但是找原因的过程还是很有收获的。

编译期间执行的是 ./configure --prefix=./output, 也就是把最后的 binlib 等放入的是 ./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, 成功编译!

Comments