Glib 链接错误:未定义的引用

Posted

技术标签:

【中文标题】Glib 链接错误:未定义的引用【英文标题】:Glib linking error: undefined reference to 【发布时间】:2014-04-21 15:03:48 【问题描述】:

我不确定这是否是问我问题的正确方式。我只是尝试解决问题 4 天,现在我非常沮丧...我有以下问题:

之后我安装了 Ubuntu 13。以及一些库和软件包。然后我安装了 glib2 一切都很顺利,在执行 ./configure、make 或 make install 时没有出错。但是,当我尝试在 C 中编译测试文件时,我可以正常编译,但出现以下错误:

main.c:116: 参考 indéfinie vers « g_hash_table_new_full »

main.c:139: 参考 indéfinie vers « g_hash_table_lookup »

main.c:168: 参考 indéfinie vers « g_hash_table_insert »

main.c:181: 参考 indéfinie vers « g_hash_table_lookup »

main.c:211: 参考 indéfinie vers « g_hash_table_insert »

main.c:250: 参考 indéfinie vers « g_hash_table_lookup »

我编译:

gcc -D_GNU_SOURCE -I/usr/include/glib-2.0 -I/usr/include/glib-2.0/glib.h -I/usr/lib/x86_64-linux-gnu/glib-2.0/include/ - lglib-2.0 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -g -Wall -Wextra -std=c99 -lm *.c -o 格式

pkg-config --cflags --libs glib-2.0 给我:

-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lglib-2.0

我试试这个命令:

gcc -v -H -std=c99 -g -Wall -D_GNU_SOURCE $(pkg-config --cflags glib-2.0) *.c $(pkg-config --libs glib-2.0) -o 格式

但我收到了这条消息:

gcc -v -H -std=c99 -g -Wall -D_GNU_SOURCE *.c -o 格式 使用内置规范。 COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper 目标:x86_64-linux-gnu 配置:../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.8.1-10ubuntu9' --with-bugurl=file:///usr/share/doc/gcc-4.8/README。错误 --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build -id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin - -with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0- gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar- dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj。 jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-ab i=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --目标=x86_64-linux-gnu 线程模型:posix gcc 版本 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu9) COLLECT_GCC_OPTIONS='-v' '-H' '-std=c99' '-g' '-Wall' '-D' '_GNU_SOURCE' '-o' 'formattage' '-mtune=generic' '-march=x86- 64' /usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -quiet -v -imultiarch x86_64-linux-gnu -H -D _GNU_SOURCE main.c -quiet -dumpbase main.c -mtune=generic -march=x86 -64 -auxbase main -g -Wall -std=c99 -version -fstack-protector -Wformat -Wformat-security -o /tmp/ccuxfazT.s GNU C (Ubuntu/Linaro 4.8.1-10ubuntu9) 版本 4.8.1 (x86_64-linux-gnu) 由 GNU C 版本 4.8.1、GMP 版本 5.1.2、MPFR 版本 3.1.1-p2、MPC 版本 1.0.1 编译 GGC 启发式:--param ggc-min-expand=100 --param ggc-min-heapsize=131072 忽略不存在的目录“/usr/local/include/x86_64-linux-gnu” 忽略不存在的目录“/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../x86_64-linux-gnu/include”

#include "..." search starts here:
 #include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/4.8/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
GNU C (Ubuntu/Linaro 4.8.1-10ubuntu9) version 4.8.1 (x86_64-linux-gnu)
    compiled by GNU C version 4.8.1, GMP version 5.1.2, MPFR version 3.1.1-p2, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: b946adc090b5605f865521be8b22959c
. /usr/include/stdlib.h
.. /usr/include/features.h
... /usr/include/x86_64-linux-gnu/sys/cdefs.h
.... /usr/include/x86_64-linux-gnu/bits/wordsize.h
... /usr/include/x86_64-linux-gnu/gnu/stubs.h
.... /usr/include/x86_64-linux-gnu/gnu/stubs-64.h
.. /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h
.. /usr/include/x86_64-linux-gnu/bits/waitflags.h
.. /usr/include/x86_64-linux-gnu/bits/waitstatus.h
... /usr/include/endian.h
.... /usr/include/x86_64-linux-gnu/bits/endian.h
.... /usr/include/x86_64-linux-gnu/bits/byteswap.h
..... /usr/include/x86_64-linux-gnu/bits/types.h
...... /usr/include/x86_64-linux-gnu/bits/wordsize.h
...... /usr/include/x86_64-linux-gnu/bits/typesizes.h
..... /usr/include/x86_64-linux-gnu/bits/wordsize.h
..... /usr/include/x86_64-linux-gnu/bits/byteswap-16.h
.. /usr/include/xlocale.h
.. /usr/include/x86_64-linux-gnu/sys/types.h
... /usr/include/time.h
... /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h
... /usr/include/x86_64-linux-gnu/sys/select.h
.... /usr/include/x86_64-linux-gnu/bits/select.h
..... /usr/include/x86_64-linux-gnu/bits/wordsize.h
.... /usr/include/x86_64-linux-gnu/bits/sigset.h
.... /usr/include/time.h
.... /usr/include/x86_64-linux-gnu/bits/time.h
... /usr/include/x86_64-linux-gnu/sys/sysmacros.h
... /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h
.... /usr/include/x86_64-linux-gnu/bits/wordsize.h
.. /usr/include/alloca.h
... /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h
.. /usr/include/x86_64-linux-gnu/bits/stdlib-float.h
. /usr/include/stdio.h
.. /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h
.. /usr/include/libio.h
... /usr/include/_G_config.h
.... /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h
.... /usr/include/wchar.h
... /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stdarg.h
.. /usr/include/x86_64-linux-gnu/bits/stdio_lim.h
.. /usr/include/x86_64-linux-gnu/bits/sys_errlist.h
. /usr/include/string.h
.. /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h
main.c:5:18: fatal error: glib.h: No such file or directory
 #include <glib.h>
                  ^
compilation terminated.
make: *** [all] Error 1

我认为它变得更加复杂

谢谢,

【问题讨论】:

您确定安装了包libglib2.0-dev 吗? dpkg -L libglib2.0-dev |grep glib.h 说什么? @BasileStarynkevitch 是的,/usr/include/glib-2.0/glib.h 重新安装:sudo aptitude reinstall libglib2.0-dev @BasileStarynkevitch sudo aptitude reinstall libglib2.0-dev sudo: aptitude: command not found 如何解决这个问题 尝试apt-get 而不是aptitude。此外,尝试通过面对面的方式获得帮助。你看起来被许多简单的问题迷失了。 【参考方案1】:

gcc 的程序参数顺序很重要(源文件应始终位于链接库之前)。

编译

 gcc -std=c99 -g -Wall -D_GNU_SOURCE $(pkg-config --cflags glib-2.0) \
       *.c  \
       $(pkg-config --libs glib-2.0)  -o formattage

但您确实想使用类似于this one 的Makefile

当然,您还需要安装libglib2.0-dev 包,正如this answer 所提醒的那样。

顺便说一句:我(你可能是)母语为法语的人,但在 S.O.您应该用英语提问并收到英语错误消息。在为 Stack Overflow 编译之前,将 LANG 环境变量设置为 Cexport LANG=C

【讨论】:

我尝试像您在回复中指出的那样:gcc -std=c99 -g -Wall -D_GNU_SOURCE $(pkg-config --cflags glib-2.0) *.c $(pkg-config -- libs glib-2.0) -o formattage 但它提到:main.c:5:18: fatal error: glib.h: No such file or directory #include ^ 编译终止。 make: *** [all] 错误 1 正如我和 user1117884 告诉你的,你需要安装 libglib2.0-dev 安装好了 sudo apt-get install libglib2.0-dev 正在读取包列表...完成 构建依赖树 读取状态信息...完成 libglib2.0-dev 已经是最新版本了。以下软件包已自动安装且不再需要: kde-l10n-engb kde-l10n-fr 使用 'apt-get autoremove' 删除它们。 0 个已升级,0 个新安装,0 个要移除,24 个未升级。 替换 gccgcc -v -H ;然后编辑您的问题以改进它。【参考方案2】:

您需要“链接”到实现您在-I 选项中包含的接口的库。这意味着在您的构建命令中添加类似-lglib2.0 的内容。如果由于位于非标准位置而找不到库,您首先需要说-L/some/path/to/glib,位置为libglib2.0

【讨论】:

请注意,编译命令已经包含-lglib-2.0,从显示的包含路径判断,GLib 似乎安装在 Ubuntu 系统的标准位置。如果需要 -L 选项,它会包含在 pkg-config 的输出中。 对不起,我不明白我的命令有什么问题,你能解释一下吗? 你的意思是我必须这样改变:? gcc -D_GNU_SOURCE -I/usr/include/glib-2.0 -I/usr/include/glib-2.0/glib.h -I/usr/lib/x86_64-linux-gnu/glib-2.0/include/ -L/usr /share/doc/libglib2.0-0 -lglib-2.0 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -g -Wall -Wextra -std=c99 -lm *.c -o 格式 先尝试不使用-L/usr/share/doc/libglib2.0-0,如果GLib 安装在标准位置,您可能只需要-l 选项而不需要-L。看看它是否有效并告诉我们。如果您最终需要-L 选项,则路径将不在doc,而是在某个lib 位置。 不,这只是gcc的程序参数顺序问题【参考方案3】:

由于没有找到-lglib-2.0 没有错误,我们可以假设它已找到并传递给链接器。但是符号仍然丢失。

我不知道这怎么会发生。您可以检查文件是否包含符号

readelf -Ws /usr/lib/x86_64-linux-gnu/libglib-2.0.so | grep g_hash_table

否则,我是否理解正确,您从源代码安装了 glib2?你没有安装它是有原因的吗

sudo apt-get install libglib2.0-dev

【讨论】:

以上是关于Glib 链接错误:未定义的引用的主要内容,如果未能解决你的问题,请参考以下文章

链接器错误:未定义的引用

Opencv '未定义的对 `cv::namedWindow....' 的引用(链接错误)

链接器错误 - 未定义的引用 -gcc

链接器错误:未定义的函数引用

链接器错误:未定义对符号“glOrtho”的引用

链接器错误:未定义对“QGLViewer 的 vtable”的引用