在 ubuntu 中使用 glib 时遇到未定义的引用

Met undefined reference when use glib in ubuntu

我对此进行了很多搜索。并尝试了很多。只是不知道哪里错了。

这是我的代码,非常简单:

#include <glib.h>
int main()
{
    int *ip=g_new(int,1);
    *ip=42;
    return *ip;
}

首先,我在我的 Ubuntu 和 Mint 中尝试 apt-get libglib2.0-dev,完成后,编译:

gcc `pkg-config --cflags --libs glib-2.0` -o main main.c
/tmp/ccYFljQD.o: In function `main':
main.c:(.text+0x13): undefined reference to `g_malloc_n'
collect2: error: ld returned 1 exit status
Makefile:3: recipe for target 'all' failed
make: *** [all] Error 1

pkg-config 的输出:

$ 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

所以还是不行,那我尝试从源码编译,自己安装一个。 我有apt-get libffi-dev, autogen 和configure, make, make install 就可以了

$ pkg-config --cflags --libs glib-2.0
-I/home/donpope/software/include/glib-2.0 -I/home/donpope/software/lib/glib-2.0/include -L/home/donpope/software/lib -lglib-2.0

编译还是报错:

gcc `pkg-config --cflags --libs glib-2.0` -o main main.c
/tmp/cctR3iEq.o: In function `main':
main.c:(.text+0x13): undefined reference to `g_malloc_n'
collect2: error: ld returned 1 exit status
Makefile:3: recipe for target 'all' failed
make: *** [all] Error 1

所以我需要一些帮助。谢谢!

更新: 后来我在 RedHat 上用旧的 gcc 试试这个。而且没关系。

我的 glib 沙箱中有这个 Makefile:

PKGS=glib-2.0
CFLAGS+=$(shell pkg-config --cflags $(PKGS))
LDFLAGS+=$(shell pkg-config --libs $(PKGS))

%: %.c
    $(CC) $(CFLAGS) $< -o $@ $(LIBS) $(LDFLAGS)

%.o: %.c
    $(CC) $(CFLAGS) $< -c -o $@

%: %.o
    $(CC) $< -o $@ $(LIBS) $(LDFLAGS)

从这里开始并进行调整,您应该能够找出确切的命令行并编译您的程序。

此外,您应该确保 PKG_CONFIG_PATH 已正确更新以包含安装 glib 的路径(通常在 PREFIX/lib/pkgconfig 中)。

Ubuntu 18.04 这里。我不得不将我所有的 glib 标志放在编译语句的末尾,即使在源 .c 文件之后。所以编译得很好:

gcc -Wall -o bfs bfs.c `pkg-config --cflags glib-2.0` `pkg-config --libs glib-2.0`

但这不是 :

gcc -Wall -o bfs `pkg-config --cflags glib-2.0` `pkg-config --libs glib-2.0` bfs.c

    /tmp/ccvWsLk3.o: In function `newGraph':
    bfs.c:(.text+0x58): undefined reference to `g_hash_table_new'
    collect2: error: ld returned 1 exit status

这让我抓狂了一段时间,因为我被告知将源文件放在编译语句的末尾总是好的风格。 :p