我正在尝试使用我刚刚在Eclipse中使用MinGW在Windows上编译的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
答案 0 :(得分:0)
由于-L
之前缺少$(LIBRARY_PATH)
,因此无法找到库路径。来自gcc man:
-L dir
将目录 dir 添加到要搜索-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
LIBRARY_PATH
的值是以冒号分隔的目录列表, 很像PATH
。当配置为本机编译器时,GCC会尝试使用 搜索特殊链接器文件时指定的目录,如果 它无法使用GCC_EXEC_PREFIX
找到它们。使用GCC链接也使用 搜索-l
的普通库时这些目录 选项(但首先使用-L
指定的目录)。