无法在 Eclipse 中使用 gcc -shared 找到库来构建 dll

标签 c gcc ffmpeg mingw

我正在尝试在 Eclipse 的 C 程序中使用我刚刚在 Windows 上使用 MinGW 编译的 FFMPEG 库。我已经成功构建了一个简单的 HelloJNI.c 文件并运行它:

gcc $(INCLUDES) -c -g -w HelloJNI.c
gcc -shared -o $(BIN_DIR)/hello.dll HelloJNI.o

我现在正在尝试编译使用 FFMPEG 的 ffmpeg_native.c 文件,但运行以下命令时出现错误:

LIBRARY_PATH = -L:"c:/Dev/msys-1.0/local/lib" -L:"c:/Dev/msys-1.0/local"
INCLUDES = -I$(SRC_DIR) -I"c:/Dev/msys-1.0/local/include" -I"c:/Program Files/Java/jdk1.8.0_45/include" -I"c:/Program Files/Java/jdk1.8.0_45//include/win32"
BIN_DIR = ../bin

gcc $(INCLUDES) -c -g -w ffmpeg_native1.1.4.c
gcc -shared -o $(BIN_DIR)/exportnative.dll ffmpeg_native1.1.4.o $(LIBRARY_PATH) -lffmpeg -lavcodec -lx264 -lavformat -lavutil -lswscale

第一行运行正常,但第二行显示以下输出:

c:/Dev/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.3/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lavcodec
[etc for all libraries]

我很困惑,因为我能够在 MinGW 中成功运行以下命令:

ld -o /local/libffmpeg.so -L/local/lib -lavcodec -lx264 -lavformat -lavutil -lswscale

最佳答案

由于 $(LIBRARY_PATH) 之前缺少 -L,因此无法找到库路径。来自海湾合作委员会人:

-Ldir
Add directory dir to the list of directories to be searched for -l.

因此,如果LIBRARY_PATH包含包含所需库的目录并且其他一切都很好,则以下应该可以工作:

gcc -shared -o $(BIN_DIR)/exportnative.dll ffmpeg_native1.1.4.o -L$(LIBRARY_PATH) -lffmpeg -lavcodec -lx264 -lavformat -lavutil -lswscale
<小时/>

-L 和路径之间不需要放置冒号:。应将以下列表添加到命令行:

-L"c:/Dev/msys-1.0/local/lib" -L"c:/Dev/msys-1.0/local"`
<小时/>

请注意,最好使用其他环境变量名称来构建命令行,因为 gcc 直接使用 LIBRARY_PATH:

LIBRARY_PATH
The value of LIBRARY_PATH is a colon-separated list of directories, much like PATH. When configured as a native compiler, GCC tries the directories thus specified when searching for special linker files, if it can't find them using GCC_EXEC_PREFIX. Linking using GCC also uses these directories when searching for ordinary libraries for the -l option (but directories specified with -L come first).

关于无法在 Eclipse 中使用 gcc -shared 找到库来构建 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32800187/

相关文章:

c - 我怎样才能让数组从用户那里读取?

c++ - 了解 C++ 中的位移位

ffmpeg - 使用 ffmpeg 在纯色背景色上叠加延时视频

ffmpeg - 为什么使用 FFmpeg 缩放时帧数会发生变化?

c - IDEA/CFB模式解密和损坏的 block

c - typedef 结构混淆中的指针

c - 比较char和unsigned char时如何启用编译器警告?

linux - FFMPEG 拖放 sh 文件

c - 特殊字 rune 字

c - 编译大量代码生成的源文件的任何提示?