使用 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

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

  • 错误类型:链接阶段未定义的引用(undefined reference)
  • 缺失的函数:sqrt、exp、log等数学函数
  • 问题原因:编译时没有链接数学库(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

相关推荐
进化中的刀盾兽37 分钟前
从零实现 C++ Json-Rpc(十):把消息交给真实连接——MuduoConnection 与 ConnectionFactory
c++·rpc
青瓦梦滋7 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http
Zwawa11 小时前
编译器工具链:GCC、Clang、MSVC、ICC、armclang
c语言·嵌入式·编译器
学逆向的12 小时前
C 指针常量与常量指针
c语言·开发语言·网络安全
水饺编程12 小时前
第2章:Linux 基础,exit 命令
linux·c语言·汇编
CodeYp201913 小时前
第15讲:二叉搜索树
开发语言·c++·二叉搜索树
pipixia2003313 小时前
C++继承面试四连问:内存叠加、私有继承、sizeof、权限重映射
c++·面试·嵌入式·继承·面向对象·对象模型
极客 - L U14 小时前
卡尔曼滤波从零到精通
c语言·数据结构·单片机·嵌入式硬件·mcu
牵猫散步的鱼儿16 小时前
C++ 内存分区
c++
choumin16 小时前
C++ 标准容器为什么不能存引用
c++·容器·引用类型