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

为什么mingw找不到gcc可以找到的库?,gcc,mingw-w64,Gcc,Mingw W64,我正在尝试为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 它说没有找到头文件 将build命令更改为 x86_64-w64-mingw32-gcc decode_v

我正在尝试为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
它说没有找到头文件

将build命令更改为

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):未定义对
av_packet_alloc'的引用 /tmp/ccgn1NTi.o:decode_video.c:(.text+0x37d):未定义对
avcodec_find_decoder'的引用
/tmp/ccgn1NTi.o:decode_video.c:(.text+0x3d0):未定义对
av_parser_init'的引用 /tmp/ccgn1NTi.o:decode_video.c:(.text+0x421):未定义对
avcodec_alloc_context3'的引用
/tmp/ccgn1NTi.o:decode_video.c:(.text+0x481):未定义对
avcodec_open2'的引用 /tmp/ccgn1NTi.o:decode_video.c:(.text+0x512):未定义对
av_frame_alloc'的引用
/tmp/ccgn1NTi.o:decode_video.c:(.text+0x5fc):未定义对av_parser_parse2的引用
/tmp/ccgn1NTi.o:decode_video.c:(.text+0x6f8):未定义对
av_解析器的引用\u close'
/tmp/ccgn1NTi.o:decode_video.c:(.text+0x707):未定义对
avcodec_free_上下文的引用' /tmp/ccgn1NTi.o:decode_video.c:(.text+0x716):未定义对
av_frame_free'的引用
/tmp/ccgn1NTi.o:decode_video.c:(.text+0x722):未定义对
av_数据包的引用\u free'
collect2:错误:ld返回1退出状态

最后,它显示您试图针对不兼容体系结构的库进行链接:

为什么mingw找不到gcc可以找到的库

  • 两个编译器都在为链接器使用不同的默认选项

  • 即使使用相同的
    -L
    和相同的
    LD\u LIBRARY\u路径
    等,链接器也会跳过不兼容的库。在您的例子中,
    gcc
    大概由
    x86_64-linux-gnu
    ,而
    x86_64-w64-mingw32-gcc
    显然由
    x86_64-w64-mingw32
    托管。两者都不相容


  • 尝试将
    -I
    添加到
    包含
    libavcodec/avcodec.h
    的编译中。如果需要更多路径,请添加更多
    -I
    。如果应该是系统标题,请使用
    -issystem
    。将
    -v-H
    添加到编译中,以查看正在使用哪些include路径。gcc打印:
    #包括“…”搜索从这里开始:
    #包括搜索从这里开始:
    
  • 尝试将
    -L
    添加到链接阶段,其中
    包含要链接的库,如
    lib*.a
    /
    lib*.so
    。添加
    -Wl,-v
    以查看编译器驱动程序将哪些选项传递给GNU链接器
    ld

  • 确保符号在库中,例如使用
    nm
    x86\u 64-w64-mingw32-nm
    等工具

  • 确保使用的库是使用
    x86_64-w64-mingw32
    工具链交叉编译的库


  • 什么头文件?decode_video.c:34:10:致命错误:libavcodec/avcodec.h:没有这样的文件或目录#include^~~~~~~~~~~~~~~~~~~~~~~~~编译已终止。这正是我所做的。您可以在已编辑的命令中看到这些目录用于头文件和库。a位置和它生成的aeerror这是指向verbose的链接输出所述库中的符号?是的,我已经检查了它们,如果它们不存在,它将如何编译gcc@Wajdi穆赫塔迪:你不是在尝试使用相同的库,是吗?见第4条。在我的回答中。您需要使用
    x86_64-w64-mingw32
    工具链交叉编译libs。