在 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
我对此进行了很多搜索。并尝试了很多。只是不知道哪里错了。
这是我的代码,非常简单:
#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