我試圖編譯一個同時使用libjpeg和libpng的項目。我知道libpng需要zlib,所以我編譯了所有這三個獨立並將它們(libjpeg.a,libpng.a和libz.a)放在名爲linrel32
的文件夾中。我執行則是:與libpng&zlib鏈接?
g++ -Llinrel32/ program.cpp otherfile.cpp -o linrel32/executable -Izlib/ -Ilpng140/ -Ijpeg/ -lpthread -lX11 -O2 -DLINUX -s -lz -lpng -ljpeg
所以,我包括三個庫。儘管如此,鏈接器抱怨:
linrel32//libpng.a(png.o): In function `png_calculate_crc':
png.c:(.text+0x97d): undefined reference to `crc32'
linrel32//libpng.a(png.o): In function `png_reset_crc':
png.c:(.text+0x9be): undefined reference to `crc32'
linrel32//libpng.a(png.o): In function `png_reset_zstream':
png.c:(.text+0x537): undefined reference to `inflateReset'
linrel32//libpng.a(pngread.o): In function `png_read_destroy':
pngread.c:(.text+0x6f4): undefined reference to `inflateEnd'
linrel32//libpng.a(pngread.o): In function `png_read_row':
pngread.c:(.text+0x1267): undefined reference to `inflate'
linrel32//libpng.a(pngread.o): In function `png_create_read_struct_2':
(...你的想法:d)
collect2: ld returned 1 exit status
我知道缺少的功能是從zlib的,和我添加的zlib那裏。打開libz.a,它似乎有一個很好的結構。重新編譯它,一切看起來都很好。但它不是...
我不知道,這很可能是問題微不足道,我需要的是睡一會兒。但儘管如此,如果你能幫助我弄清楚這件事......
謝謝。你是絕對正確的。我認爲這個命令是可能的,但我沒有任何真正的理由支持這個理論。我錯誤地認爲鏈接器將所有內容放入「池」中,然後在追蹤每段代碼後刪除未使用的函數。 – huff 2010-03-07 06:14:41
@huff - 不客氣。僅供參考,訂單僅適用於靜態檔案;如果您使用共享對象,則無關緊要。 – 2010-03-07 06:16:20
現在混入例如CMake和樂趣變得更大(特別是在傳遞VERBOSE = 1之前)。 zlib是一個靜態庫嗎? boost :: iostreams依賴zlib存在類似的問題;它在我的機器上失敗,但在其他機器上失敗。無論如何 - 這是一個很好的經驗法則 - 最「基本」的依賴關係最後。 – 2016-01-14 12:33:54