C++ 如何使用g++;
如何正确设置makefile以将一些OpenCV库导入libmat.o 这是make文件:C++ 如何使用g++;,c++,opencv,makefile,java-native-interface,g++,C++,Opencv,Makefile,Java Native Interface,G++,如何正确设置makefile以将一些OpenCV库导入libmat.o 这是make文件: # Define a variable for classpath CLASS_PATH = ../bin # Debug: -g3=compile with extra debugg infos. -ggdbg3=include things like macro defenitions. -O0=turn off optimizations. DEBUGFLAGS = -g3 -ggdb3 -O0
# Define a variable for classpath
CLASS_PATH = ../bin
# Debug: -g3=compile with extra debugg infos. -ggdbg3=include things like macro defenitions. -O0=turn off optimizations.
DEBUGFLAGS = -g3 -ggdb3 -O0
CFLAGS = $(DEBUGFLAGS)
# Define a virtual path for .class in the bin directory
vpath %.class $(CLASS_PATH)
all : libMat.so
# $@ matches the target, $< matches the first dependancy
libMat.so : libMat.o
g++ $(CFLAGS) -W -shared -o $@ $<
# $@ matches the target, $< matches the first dependancy
libMat.o : Mat2Image.cpp Mat2Image.h
g++ $(CFLAGS) -fPIC -I/usr/lib/jvm/jdk1.8.0_111/include -I/usr/lib/jvm/jdk1.8.0_111/include/linux -c $< -o $@ -L/usr/local/lib
# $* matches the target filename without the extension
# manually this would be: javah -classpath ../bin HelloJNI
HelloJNI.h : Mat2Image.class
javah -classpath $(CLASS_PATH) $*
clean :
rm -f Mat2Image.h libMat.o libMat.so
#为类路径定义一个变量
类路径=../bin
#调试:-g3=使用额外的调试信息进行编译-ggdbg3=包括诸如宏防御之类的内容-O0=关闭优化。
DEBUGFLAGS=-g3-ggdb3-O0
CFLAGS=$(调试标志)
#在bin目录中为.class定义虚拟路径
vpath%.class$(类路径)
所有人:libMat.so
#$@匹配目标,$<匹配第一个依赖项
libMat.so:libMat.o
g++$(CFLAGS)-W-shared-o$@$<
#$@匹配目标,$<匹配第一个依赖项
libMat.o:Mat2Image.cpp Mat2Image.h
g++$(CFLAGS)-fPIC-I/usr/lib/jvm/jdk1.8.0_111/include-I/usr/lib/jdk1.8.0_111/include/linux-c$<-o$@-L/usr/local/lib
#$*匹配不带扩展名的目标文件名
#手动设置为:javah-classpath../bin HelloJNI
HelloJNI.h:Mat2Image.class
javah-classpath$(类路径)$*
清洁:
rm-f Mat2Image.h libMat.o libMat.so
我需要一些位于/usr/local/lib中的OpenCV库
例如libopencv_imgproc.so我认为您想要做的是获取(例如,
libopencv_imgproc.so
),
位于/usr/local/lib
,与共享库libMat.so
链接
在makefile中尝试这样做的方式是“链接”
libopencv\u imgproc.so
通过配方使用对象文件libMat.o
:
libMat.o : Mat2Image.cpp Mat2Image.h
g++ $(CFLAGS) -fPIC -I/usr/lib/jvm/jdk1.8.0_111/include \
-I/usr/lib/jvm/jdk1.8.0_111/include/linux -c $< -o $@ \
-L/usr/local/lib
但是您不需要告诉它在/usr/local/lib
中搜索库,
因为这是链接器搜索库的目录之一
默认情况下。所以-lopencv\u imgproc
就是您所需要的一切
但更重要的是
g++ $(CFLAGS) -fPIC -I/usr/lib/jvm/jdk1.8.0_111/include \
-I/usr/lib/jvm/jdk1.8.0_111/include/linux -c $< -o $@ \
-L/usr/local/lib
这就是它应该是的
实现链接的方法是:
libMat.so : libMat.o
g++ $(CFLAGS) -W -shared -o $@ $<
这样,libMat.so
将被链接,其中包含libMat.o
和一个运行时
对共享库的依赖性libopencv\u imgproc.so
-即
运行时加载程序必须加载的指令libopencv\u imgproc.so
加载libMat.so
时进入同一进程
您的makefile还存在其他各种错误,但我所说的就足够了
解释并解决我认为您正在询问的特定问题。你
如果需要,可以通过搜索教程学习如何编写更好的makefile
关于GNU制作和学习的算法
我只想指出另一个严重的错误。你的食谱:
clean:
rm -f Mat2Image.h libMat.o libMat.so
将在运行时删除头文件Mat2Image.h
清洁
。该头文件是原始源文件之一。信息技术
不是由这个makefile生成的,比如libMat.o
和libMat.so
,除非
您已经编写了一些真正的makefile。所以
如果您删除它,您必须从源代码管理系统中恢复它;和
如果它不在源代码管理系统下,您将不得不重写它。所以
我想你只是想:
clean:
rm -f libMat.o libMat.so
谢谢!你救了我!:)@不客气:)请看@MicheleBuzzoni没问题。只是向你展示它是如何工作的。
libMat.so : libMat.o
g++ $(CFLAGS) -W -shared -o $@ $< -lopencv_imgproc
clean:
rm -f Mat2Image.h libMat.o libMat.so
clean:
rm -f libMat.o libMat.so