我在 Ubunutu 上针对 glib 编译一个简单的示例程序时遇到问题。我收到这些错误。我可以编译它,但不能与 -c 标志链接。我相信这意味着我已经安装了 glib 标头,但它没有找到共享对象代码。另请参阅下面的 make 文件。
$> make re
gcc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lglib-2.0 re.c -o re
/tmp/ccxas1nI.o: In function `print_uppercase_words':
re.c:(.text+0x21): undefined reference to `g_regex_new'
re.c:(.text+0x41): undefined reference to `g_regex_match'
re.c:(.text+0x54): undefined reference to `g_match_info_fetch'
re.c:(.text+0x6e): undefined reference to `g_print'
re.c:(.text+0x7a): undefined reference to `g_free'
re.c:(.text+0x8b): undefined reference to `g_match_info_next'
re.c:(.text+0x97): undefined reference to `g_match_info_matches'
re.c:(.text+0xa7): undefined reference to `g_match_info_free'
re.c:(.text+0xb3): undefined reference to `g_regex_unref'
collect2: ld returned 1 exit status
make: *** [re] Error 1
使用的生成文件:
# Need to installed libglib2.0-dev some system specific install that will
# provide a value for pkg-config
INCLUDES=$(shell pkg-config --libs --cflags glib-2.0)
CC=gcc $(INCLUDES)
PROJECT=re
# Targets
full: clean compile
clean:
rm $(PROJECT)
compile:
$(CC) $(PROJECT).c -o $(PROJECT)
正在编译的.c代码:
#include <glib.h>
void print_upppercase_words(const gchar *string)
{
/* Print all uppercase-only words. */
GRegex *regex;
GMatchInfo *match_info;
regex = g_regex_new("[A-Z]+", 0, 0, NULL);
g_regex_match(regex, string, 0, &match_info);
while (g_match_info_matches(match_info))
{
gchar *word = g_match_info_fetch(match_info, 0);
g_print("Found %s\n", word);
g_free(word);
g_match_info_next(match_info, NULL);
}
g_match_info_free(match_info);
g_regex_unref(regex);
}
int main()
{
gchar *string = "My body is a cage. My mind is THE key.";
print_uppercase_words(string);
}
奇怪的是,当我运行glib-config
它时,它不喜欢那个命令——尽管我不知道如何告诉 bash 或如何在它抱怨gdlib-config
这两个包中的一个时使用另一个命令。
$> glib-config
No command 'glib-config' found, did you mean:
Command 'gdlib-config' from package 'libgd2-xpm-dev' (main)
Command 'gdlib-config' from package 'libgd2-noxpm-dev' (main)
glib-config: command not found
答案1
油嘴滑舌不是你的问题。这是:
re.c:(.text+0xd6): undefined reference to `print_uppercase_words'
它的意思是你正在调用一个函数print_uppercase_words
,但它找不到它。
这是有原因的。仔细观察。有一个错字:
void print_upppercase_words(const gchar *string)
修复该问题后,您可能仍然会遇到问题,因为您是在需要这些库的模块之前指定这些库的。简而言之,你的命令应该写成
gcc -o re re.o -lglib-2.0
那么-lglib-2.0
接下来就是re.o
。
所以我会像这样编写你的 Makefile:
re.o: re.c
$(CC) -I<includes> -o $@ -c $^
re: re.o
$(CC) $^ -l<libraries> -o $@
事实上,如果您设置了正确的变量,make
它会自动为您解决所有问题。
CFLAGS=$(shell pkg-config --cflags glib-2.0)
LDLIBS=$(shell pkg-config --libs glib-2.0)
CC=gcc
re: re.o