Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

-lpng -ljpeg -lz

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

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

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

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

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

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

Ответ 2

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

extern "C" {
#include <zlib.h>
}