为什么mingw找不到gcc找不到的库?

Why cant mingw find libraries that gcc can find?

我正在尝试为 windows 和 ubuntu 编译一个 c 程序来做到这一点我正在使用 mingw 但它似乎无法找到 gcc 可以找到的所需库 当我执行这个命令时

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 toav_packet_alloc 的未定义引用 /tmp/ccgn1NTi.o:decode_video.c:(.text+0x37d): 未定义引用 avcodec_find_decoder' /tmp/ccgn1NTi.o:decode_video.c:(.text+0x3d0): undefined reference toav_parser_init' /tmp/ccgn1NTi.o:decode_video.c:(.text+0x421): 未定义引用 avcodec_alloc_context3' /tmp/ccgn1NTi.o:decode_video.c:(.text+0x481): undefined reference toavcodec_open2' /tmp/ccgn1NTi.o:decode_video.c:(.text+0x512): 未定义引用 av_frame_alloc' /tmp/ccgn1NTi.o:decode_video.c:(.text+0x5fc): undefined reference toav_parser_parse2' /tmp/ccgn1NTi.o:decode_video.c:(.text+0x6f8): 未定义引用 av_parser_close' /tmp/ccgn1NTi.o:decode_video.c:(.text+0x707): undefined reference toavcodec_free_context' /tmp/ccgn1NTi.o:decode_video.c:(.text+0x716): 未定义引用 av_frame_free' /tmp/ccgn1NTi.o:decode_video.c:(.text+0x722): undefined reference toav_packet_free' collect2:错误:ld 返回了 1 个退出状态

最后,您尝试 link 针对不兼容架构的库:

Why can't mingw find libraries that gcc can find?

  • 两个编译器都对 linker 使用不同的默认选项。

  • 即使使用相同的 -L <path> 和相同的 LD_LIBRARY_PATH 等,linker 也会跳过不兼容的库。在您的情况下,gcc 大概由 x86_64-linux-gnu,而 x86_64-w64-mingw32-gcc 显然是由 x86_64-w64-mingw32 主持的。两者不兼容。


  1. 尝试将 -I <path> 添加到 <path> 包含 libavcodec/avcodec.h 的编译中。如果您需要更多路径,请添加更多 -I。如果它应该是系统 headers,请使用 -isystem <path>。将 -v -H 添加到编译中以查看正在使用的包含路径。 gcc 打印:
    #include "..." search starts here:
    #include <...> search starts here:
    
  2. 尝试将 -L <path> 添加到 link 阶段,其中 <path> 包含像 lib*.a / lib*.so 这样的库 link反对。添加 -Wl,-v 以查看编译器 driver 将哪些选项传递给 GNU linker ld.

  3. 确保符号在库中,例如使用 nmx86_64-w64-mingw32-nm.

  4. 等工具
  5. 确保您使用的库 cross-compiled 使用 x86_64-w64-mingw32 工具链。