共享库和ldflags的“未定义的引用”错误
发布时间:2020-12-16 07:06:10 所属栏目:百科 来源:网络整理
导读:当尝试使用make在QEMU中编译我的代码时,在链接阶段我得到一个未定义的引用错误. Afaik配置参数是正确的,因此共享库应该正确用于链接,但也许我忽略了一些东西. 任何帮助,将不胜感激! 以下是我已收集的大量其他信息: 解决方案:见Zach’s answer 我现在通过
当尝试使用make在QEMU中编译我的代码时,在链接阶段我得到一个未定义的引用错误. Afaik配置参数是正确的,因此共享库应该正确用于链接,但也许我忽略了一些东西.
任何帮助,将不胜感激! 以下是我已收集的大量其他信息: 解决方案:见Zach’s answer 我现在通过将LIBS = -lcity添加到Makefile.target文件来管理它. 谢谢大家! 更新: 使V = 1输出: cc -Werror -fPIE -DPIE -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -I/home/user/cityhash -Wendif-labels -Wmissing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-all -I/usr/include/p11-kit-1 -I/usr/include/libpng12 -I/usr/include/pixman-1 -I../linux-headers -I.. -I/home/user/qemu/target-i386 -DNEED_CPU_H -I/home/user/qemu/include -pthread -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -O2 -D_FORTIFY_SOURCE=2 -g -Wl,--warn-common -Wl,-z,relro -Wl,now -pie -m64 -g -L/home/user/lib -Wl,-rpath=/home/user/lib -lcity -o qemu-system-x86_64 [… all *.o files … ] ../libqemuutil.a ../libqemustub.a -lrt -pthread -lgthread-2.0 -lrt -lglib-2.0 -lutil -lrbd -lrados -lbluetooth -lcurl -lncurses -ltinfo -lbrlapi -luuid -lpng12 -ljpeg -lsasl2 -lgnutls -lSDL -lX11 -lz -laio -lpixman-1 -lm 接下来是我在下面写的正常错误输出(除了LINK,在这种情况下缺少). 错误: ~/qemu$make ... LINK x86_64-softmmu/qemu-system-x86_64 my_code.o: In function `function`: /home/user/qemu/my_code.c:982: undefined reference to `CityHash64' ... collect2: error: ld returned 1 exit status make[1]: *** [qemu-system-x86_64] Error 1 make: *** [subdir-x86_64-softmmu] Error 2 配置参数: ./configure [...] --extra-cflags='-I/home/user/cityhash' --extra-ldflags='-L/home/user/lib -Wl,-rpath=/home/user/lib -lcity' 文件夹结构: ~ ├─ cityhash/ │ ├─ city.h │ └─ ... ├─ lib/ │ ├─ libcity.so │ └─ ... └─ qemu/ 标题包含和函数用法(my_code.c): [...] 11 #include "city.h" 982 hash = CityHash64(buf,len); [...] 共享库的Nm输出: ~/lib$nm libcity.so [...] 0000000000000fdc T CityHash64 [...] make期间的Strace输出: ~/qemu$strace -f -o ../strace.out -- make [...] 16111 stat("/home/user/lib/libcity.so",{st_mode=S_IFREG|0755,st_size=18468,...}) = 0 16111 open("/home/user/lib/libcity.so",O_RDONLY) = 7 16111 fcntl(7,F_GETFD) = 0 16111 fcntl(7,F_SETFD,FD_CLOEXEC) = 0 16111 fstat(7,...}) = 0 16111 mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0) = 0x2aaaaaad9000 16111 lseek(7,SEEK_SET) = 0 16111 read(7,"177ELF211 3 > |