Соединение с libpng и zlib?

Я пытаюсь скомпилировать проект, который использует и libjpeg и libpng. Я знаю, что libpng нужен zlib, таким образом, я скомпилировал все три независимо и поместил их (libjpeg.a, libpng.a и libz.a) на названной папке linrel32. Что я выполняю, затем:

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 и это, кажется, имеют хорошую структуру. Перекомпилированный это, все выглядит хорошо. Но это не...

Я не знаю, вероятно, что проблема тривиальна, и в чем я нуждаюсь, должен спать некоторое время. Но тем не менее, если Вы могли бы помочь мне выяснить эту вещь...

22
задан huff 20 February 2015 в 05:06
поделиться

2 ответа

Вам необходимо изменить порядок библиотек:

-lpng -ljpeg -lz

Что происходит, так это то, что компоновщик имеет особые правила относительно того, как он обрабатывает статические библиотеки. Что он делает, так это то, что он включает .o изнутри .a только в том случае, если .o требуется для удовлетворения ссылки.

Кроме того, он обрабатывает статические архивы в том порядке, в котором они появляются в строке ссылки.

Итак, ваш код не вызывает напрямую никаких функций в zlib. Поэтому, когда компоновщик сначала обрабатывает -lz, к нему еще нет никаких вызовов, поэтому он не втягивает ни один из zlib.

Затем, когда компоновщик обрабатывает libpng, он видит, что к нему обращаются из вашего кода. Таким образом, он извлекает код из libpng и, поскольку он вызывает zlib, теперь есть ссылки на функции zlib.

Теперь вы подошли к концу ваших библиотек, и есть неудовлетворенные вызовы, которые вызывают вашу ошибку.

Итак, если libhigh.a использует liblow.a, вы должны иметь -lhigh перед -llow в вашем порядке ссылок.

43
ответ дан 29 November 2019 в 04:44
поделиться

вероятно, вам нужно окружить заголовки zlib и png символами extern "C", например:

extern "C" {
#include <zlib.h>
}
-2
ответ дан 29 November 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: