Compiling
針對 glib 編譯時出現連結器錯誤…?
我無法在 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
使用的 Makefile:
# 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
油嘴滑舌不是你的問題。這是:
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