使用 LLVM 16.0.4 编译 MiBench 中的 tiff-v3.5.4 时遇到编译链接错误

错误信息如下

复制代码
DEBUG: We are skipping bitcode generation because we did not see any input files.
AUDIT:LINKING /root/SVF/llvm-16.0.4.obj/bin/clang [-o fax2tiff -std=gnu89 -O0 -Xclang -optnone -g -fno-discard-value-names -w -I. -I../tools -I../libtiff fax2tiff.o ../libtiff/libtiff.a]
DEBUG:Calling execCmd(/root/SVF/llvm-16.0.4.obj/bin/clang, [-o fax2tiff -std=gnu89 -O0 -Xclang -optnone -g -fno-discard-value-names -w -I. -I../tools -I../libtiff fax2tiff.o ../libtiff/libtiff.a])
/opt/binutils/bin/ld: ../libtiff/libtiff.a(tif_luv.o): in function `L16toGry':
/root/mibench-master/consumer/tiff-v3.5.4/libtiff/../libtiff/tif_luv.c:662:(.text+0x1ee9): undefined reference to `sqrt'
/opt/binutils/bin/ld: ../libtiff/libtiff.a(tif_luv.o): in function `pix24toXYZ':
/root/mibench-master/consumer/tiff-v3.5.4/libtiff/../libtiff/tif_luv.c:747:(.text+0x20ed): undefined reference to `exp'
/opt/binutils/bin/ld: ../libtiff/libtiff.a(tif_luv.o): in function `XYZtoRGB24':
/root/mibench-master/consumer/tiff-v3.5.4/libtiff/../libtiff/tif_luv.c:686:(.text+0x24c7): undefined reference to `sqrt'
/opt/binutils/bin/ld: /root/mibench-master/consumer/tiff-v3.5.4/libtiff/../libtiff/tif_luv.c:687:(.text+0x2534): undefined reference to `sqrt'
/opt/binutils/bin/ld: /root/mibench-master/consumer/tiff-v3.5.4/libtiff/../libtiff/tif_luv.c:688:(.text+0x25a2): undefined reference to `sqrt'
/opt/binutils/bin/ld: ../libtiff/libtiff.a(tif_luv.o): in function `pix16toY':
/root/mibench-master/consumer/tiff-v3.5.4/libtiff/../libtiff/tif_luv.c:624:(.text+0x27c7): undefined reference to `exp'
/opt/binutils/bin/ld: ../libtiff/libtiff.a(tif_luv.o): in function `pix24fromXYZ':
/root/mibench-master/consumer/tiff-v3.5.4/libtiff/../libtiff/tif_luv.c:774:(.text+0x39f6): undefined reference to `log'
/opt/binutils/bin/ld: ../libtiff/libtiff.a(tif_luv.o): in function `pix16fromY':
/root/mibench-master/consumer/tiff-v3.5.4/libtiff/../libtiff/tif_luv.c:638:(.text+0x3e4c): undefined reference to `log'
/opt/binutils/bin/ld: /root/mibench-master/consumer/tiff-v3.5.4/libtiff/../libtiff/tif_luv.c:640:(.text+0x3eb3): undefined reference to `log'
clang-16: error: linker command failed with exit code 1 (use -v to see invocation)
DEBUG:execCmd: /root/SVF/llvm-16.0.4.obj/bin/clang [-o fax2tiff -std=gnu89 -O0 -Xclang -optnone -g -fno-discard-value-names -w -I. -I../tools -I../libtiff fax2tiff.o ../libtiff/libtiff.a] had exitCode 1
DEBUG:execCmd: error was exit status 1
ERROR:Failed to compile using given arguments:
/root/SVF/llvm-16.0.4.obj/bin/clang [-o fax2tiff -std=gnu89 -O0 -Xclang -optnone -g -fno-discard-value-names -w -I. -I../tools -I../libtiff fax2tiff.o ../libtiff/libtiff.a]
exit status: exit status 1
DEBUG:Calling [gclang -o fax2tiff -std=gnu89 -O0 -Xclang -optnone -g -fno-discard-value-names -w -I. -I../tools -I../libtiff fax2tiff.o ../libtiff/libtiff.a] returned 1
make[1]: *** [Makefile:209:fax2tiff] 错误 1
make[1]: 离开目录"/root/mibench-master/consumer/tiff-v3.5.4/tools"
make: *** [Makefile:49:all] 错误 2

这是一个编译链接错误,主要问题是链接器找不到数学库中的函数(如sqrtexplog等)。

  • 错误类型:链接阶段未定义的引用(undefined reference)
  • 缺失的函数:sqrtexplog等数学函数
  • 问题原因:编译时没有链接数学库(libm
  • 解决方案:在编译命令中添加-lm选项来链接数学库

我的解决方案:

  1. 编辑mibench-master/consumer/tiff-v3.5.4/tools/Makefile

  2. 修改CFLAGS,在最后加上-lm

    COPTS = -std=gnu89 -O0 -Xclang -optnone -g -fno-discard-value-names -w
    OPTIMIZER=
    IPATH = -I. -I{SRCDIR} -I{LIBDIR}
    CFLAGS = {COPTS} {OPTIMIZER} ${IPATH} -lm

相关推荐
卷无止境1 天前
C++ 的Eigen 库全解析
c++
卷无止境1 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴1 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
博客18003 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴3 天前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake
众少成多积小致巨4 天前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
clint4568 天前
C++进阶(1)——前景提要
c++
夜悊8 天前
C++代码示例:进制数简单生成工具
c++
郝学胜_神的一滴8 天前
CMake 021: IF 条件判据详诠
c++·cmake
_wyt0019 天前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp