Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用g++;_C++_Opencv_Makefile_Java Native Interface_G++ - Fatal编程技术网

C++ 如何使用g++;

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

如何正确设置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
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