为什么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 to
av_packet_alloc 的未定义引用
/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_video.c:(.text+0x716): 未定义引用 av_frame_free'
/tmp/ccgn1NTi.o:decode_video.c:(.text+0x722): undefined reference to
av_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
主持的。两者不兼容。
- 尝试将
-I <path>
添加到 <path>
包含 libavcodec/avcodec.h
的编译中。如果您需要更多路径,请添加更多 -I
。如果它应该是系统 headers,请使用 -isystem <path>
。将 -v -H
添加到编译中以查看正在使用的包含路径。 gcc 打印:
#include "..." search starts here:
#include <...> search starts here:
尝试将 -L <path>
添加到 link 阶段,其中 <path>
包含像 lib*.a
/ lib*.so
这样的库 link反对。添加 -Wl,-v
以查看编译器 driver 将哪些选项传递给 GNU linker ld
.
确保符号在库中,例如使用 nm
或 x86_64-w64-mingw32-nm
.
等工具
确保您使用的库 cross-compiled 使用 x86_64-w64-mingw32
工具链。
我正在尝试为 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 to
av_packet_alloc 的未定义引用
/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_video.c:(.text+0x716): 未定义引用 av_frame_free'
/tmp/ccgn1NTi.o:decode_video.c:(.text+0x722): undefined reference to
av_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
主持的。两者不兼容。
- 尝试将
-I <path>
添加到<path>
包含libavcodec/avcodec.h
的编译中。如果您需要更多路径,请添加更多-I
。如果它应该是系统 headers,请使用-isystem <path>
。将-v -H
添加到编译中以查看正在使用的包含路径。 gcc 打印:#include "..." search starts here: #include <...> search starts here:
尝试将
-L <path>
添加到 link 阶段,其中<path>
包含像lib*.a
/lib*.so
这样的库 link反对。添加-Wl,-v
以查看编译器 driver 将哪些选项传递给 GNU linkerld
.确保符号在库中,例如使用
nm
或x86_64-w64-mingw32-nm
. 等工具
确保您使用的库 cross-compiled 使用
x86_64-w64-mingw32
工具链。