2011-09-22 177 views
4

我試圖在我的應用程序中使用libjpeg。使項目在.libs文件夾中生成libjpeg.a。我想要做的是在聯動階段使用這個文件。我已經嘗試了以下內容:我將libjpeg.a複製到我的C代碼所在的文件夾中。嘗試鏈接鏈接庫的靜態版本而不是動態版本

gcc libjpeg.a mycode.c -o executable_name 

失敗。如果我使用gcc -ljpeg mycode.c,那麼當我將標題更改爲指向「libjpeg.h」而不是「libjpeg.h」時,編譯會成功,但這顯然與系統範圍的動態庫版本鏈接。

試圖用相對或絕對路徑鏈接也失敗:

gcc ./libjpeg.a mycode.c -o executable_name 

我曾嘗試靜態的選擇,以及:

gcc -static libjpeg.a mycode.c -o executable_name 

鏈接器錯誤是:

Linking... 
gcc -std=c99 -Wall -Wextra -g -pedantic ./libjpeg.a ./libjpeg.a -lm obj/read_jpeg.o obj/utils.o -o test_jpeg 
obj/read_jpeg.o: In function `read_JPEG_file': 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:37: undefined reference to `jpeg_std_error' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:45: undefined reference to `jpeg_CreateDecompress' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:46: undefined reference to `jpeg_stdio_src' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:47: undefined reference to `jpeg_read_header' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:48: undefined reference to `jpeg_start_decompress' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:62: undefined reference to `jpeg_read_scanlines' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:74: undefined reference to `jpeg_finish_decompress' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:75: undefined reference to `jpeg_destroy_decompress' 
obj/read_jpeg.o: In function `read_JPEG_file_props': 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:93: undefined reference to `jpeg_std_error' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:100: undefined reference to `jpeg_CreateDecompress' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:101: undefined reference to `jpeg_stdio_src' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:102: undefined reference to `jpeg_read_header' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:103: undefined reference to `jpeg_start_decompress' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:113: undefined reference to `jpeg_read_scanlines' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:116: undefined reference to `jpeg_finish_decompress' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:117: undefined reference to `jpeg_destroy_decompress' 
collect2: ld returned 1 exit status 
make: *** [test_jpeg] Error 1 

您可以使用Makefile下載一個簡單的項目here

回答

5

你不得不給的完整路徑libjpeg.a,如果你在的.libs夾與一個給你編,其中libjpeg.a:

gcc mycode.c -o executable_name .libs/libjpeg.a 

如果您的特殊libjpeg.a在別處,給一條完整的道路。

如果失敗了,你必須告訴我們會發生什麼。 (細節很重要,所以請複製粘貼確切的錯誤和運行的確切命令行)。

+0

謝謝。這似乎是正確的軌道,但我仍然有聯繫錯誤。 Libjpeg還創建了一個.la文件,也許我需要鏈接它。 – ustun

+0

我認爲這實際上做到了!圖書館需要結束。我會再看一看,很可能接受這個。 – ustun

+1

我同意沒有答案。請記住,未來鏈接器參數對它們的調用順序非常敏感(通常:對象只能找到它們鏈接到鏈接器線右側的函數,而不是左側)。當.la對象在遊戲中時,它們是libtool對象,您可以使用libtool鏈接到它們,也可以在.libs中找到真實的對象。 – thiton

1

您需要使用-static:

gcc -static -o exec_name mycode.c -ljpeg 

無需複製的歸檔(.a)。你可以通過閱讀man ld找到答案。

+0

我想鏈接到我的特定版本的libjpeg.a,而不是系統範圍的。 – ustun

+0

然後你必須給我們提供你的方法失敗的鏈接器錯誤。 – thiton

+0

謝謝,我已經包含鏈接器錯誤,但似乎沒有多少說明。如果你想看看,我已經包含了一個示例項目。謝謝。 – ustun

0

這可能會幫助你,如果你有我的相同的問題。在我的系統,我有

libjpeg.so.62 - > libjpeg.so.62.0.0 libjpeg.so.62.0.0

後,我加入的符號鏈接:

須藤LN -s libjpeg.so.62 libjpeg.so

我的問題解決了。