Почему mingw не может найти библиотеки, которые g cc может найти? - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь скомпилировать c программу для windows и Ubuntu, чтобы сделать это, я использую mingw, но кажется, что он не может найти необходимые библиотеки, которые g cc может найти при выполнении этой команды

gcc decode_video.c -o dv -lavcodec -lavutil

Все компилируется нормально, но когда я использую это

x86_64-w64-mingw32-gcc decode_video.c -o dv.exe -lavcodec -lavutil

, он говорит, что заголовочные файлы не найдены

после изменения команды построения на

x86_64-w64-mingw32-gcc decode_video.c -o dv.exe -I /usr/include/x86_64-linux-gnu -L /usr/lib/x86_64-linux-gnu -l avcodec -l avutil

он знает, что дает мне эту ошибку, даже если библиотеки связаны

/tmp/ccgn1NTi.o:decode_video.c:(.text+0x138): undefined reference to `avcodec_send_packet'

/ tmp / ccgn1NTi.o: decode_video. c :(. Text + 0x192): неопределенная ссылка на avcodec_receive_frame' /tmp/ccgn1NTi.o:decode_video.c:(.text+0x33f): undefined reference to av_packet_allo c '/tmp/ccgn1NTi.o:decode_video.c:(.text+0x37d): неопределенная ссылка на avcodec_find_decoder' /tmp/ccgn1NTi.o:decode_video.c:(.text+0x3d0): undefined reference to av_parser_init' /tmp/ccgn1NTi.o:decode_video.c:(.text+0x421 ): неопределенная ссылка на avcodec_alloc_context3' /tmp/ccgn1NTi.o:decode_video.c:(.text+0x481): undefined reference to avcodec_open2 '/tmp/ccgn1NTi.o:decode_video.c:(.text+0x512): неопределенная ссылка на av_frame_alloc' /tmp/ccgn1NTi.o:decode_video.c:(.text+0x5fc): undefined reference to av_parser_parse2' /tmp/ccgn1NTi.o:decode_video.c :(. text + 0x6f8): неопределенная ссылка на av_parser_close' /tmp/ccgn1NTi.o:decode_video.c:(.text+0x707): undefined reference to avcodec_free_context '/tmp/ccgn1NTi.o:decode_vide o. c :(. text + 0x716): неопределенная ссылка на av_frame_free' /tmp/ccgn1NTi.o:decode_video.c:(.text+0x722): undefined reference to av_packet_free 'collect2: ошибка: ld вернул 1 состояние выхода

1 Ответ

0 голосов
/ 06 марта 2020

Наконец, оказалось, что вы пытались связать библиотеки с несовместимой архитектурой:

Почему mingw не может найти библиотеки, которые g cc может найти?

  • Любой компилятор использует разные параметры по умолчанию для компоновщика.

  • Даже с тем же -L <path> и тем же LD_LIBRARY_PATH et c., Компоновщик пропустит несовместимые библиотеки. В вашем случае gcc предположительно размещен x86_64-linux-gnu, тогда как x86_64-w64-mingw32-gcc явно размещен x86_64-w64-mingw32. Оба несовместимы.


  1. Попробуйте добавить -I <path> к компиляции, где <path> содержит libavcodec/avcodec.h. Добавьте больше -I, если вам нужно больше путей. Используйте -isystem <path>, если предполагается, что это системные заголовки. Добавьте -v -H к компиляции, чтобы узнать, какие пути включены. g cc печатает:
    #include "..." search starts here:
    #include <...> search starts here:
    
  2. Попробуйте добавить -L <path> к этапу связи, где <path> содержит библиотеки, такие как lib*.a / lib*.so, с которыми необходимо связать. Добавьте -Wl,-v, чтобы увидеть, какие опции драйвер компилятора передает в компоновщик GNU ld.

  3. Убедитесь, что символы находятся в библиотеках, например, с помощью таких инструментов, как nm или x86_64-w64-mingw32-nm.

  4. Убедитесь, что вы используете библиотеки, кросс-компилированные с использованием x86_64-w64-mingw32 toolchain.

...