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

时间:2017-03-29 02:56:27

标签: glib

我已经搜索了很多这个。并尝试了很多。只是不知道我哪里出错了。

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

#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

所以它不工作,然后我尝试从源代码编译并自己安装一个。 我已经得到了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。它没关系。

2 个答案:

答案 0 :(得分:0)

我在我的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中)。

答案 1 :(得分:0)

Ubuntu 18.04在这里。即使在源.c文件之后,我也必须将所有glib标志放在compile语句的末尾。这样编译就可以了:

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

在我被告知将源文件放置在compile语句的末尾始终是一种很好的风格,这使我发疯了一段时间。 :p