【问题标题】:how to import opencv lib into other lib using g++如何使用g ++将opencv lib导入其他lib
【发布时间】:2017-05-06 14:03:38
【问题描述】:

如何正确设置 makefile 以将一些 OpenCV 库导入 libmat.o?

这是制作文件:

# 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

我需要一些位于 /usr/local/lib 中的 OpenCV 库 例如 libopencv_imgproc.so

【问题讨论】:

    标签: c++ opencv makefile java-native-interface g++


    【解决方案1】:

    我认为您想要做的是获取(例如)libopencv_imgproc.so, 位于/usr/local/lib,与您的共享库libMat.so链接。

    您尝试在您的 makefile 中执行此操作的方式是“链接” libopencv_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
    

    你认为最后的-L/usr/local/lib 会以某种方式让链接器 知道你想链接libopencv_imgproc.so 并这样做。

    这不起作用的原因不止一个:

    -L/usr/local/lib 只会告诉链接器 /usr/local/lib 是 您希望它搜索您要求它的库的目录 关联。它不会要求它从那里链接任何库,如果你 不要告诉它,它不会。告诉链接器 在/usr/local/lib 中搜索库要求它链接 libopencv_imgproc.so 你会使用:

    `-L/usr/local/lib -lopencv_imgproc
    

    但你不需要告诉它在/usr/local/lib 中搜索库, 因为这是链接器搜索库的目录之一 默认情况下。所以-lopencv_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 
    

    是从Mat2Image.cpp 简单编译 libMat.o 的命令。它 不做任何联系。 “链接”是不可能的,也没有意义 任何带有目标文件的东西。因此,将任何链接选项添加到您的 编译命令毫无意义。编译器将忽略它们。这个命令是 实际上没有什么不同:

    g++ $(CFLAGS) -fPIC -I/usr/lib/jvm/jdk1.8.0_111/include \
                -I/usr/lib/jvm/jdk1.8.0_111/include/linux -c $< -o $@
    

    应该是这样的。

    实现你的链接的方法是:

    libMat.so : libMat.o
        g++ $(CFLAGS) -W -shared -o $@ $<
    

    所以这是你必须告诉链接器你想要libopencv_imgproc.so的地方 要链接:

    libMat.so : libMat.o
        g++ $(CFLAGS) -W -shared -o $@ $< -lopencv_imgproc
    

    这样,libMat.so 将被链接,其中包含 libMat.o 和运行时 对共享库 libopencv_imgproc.so 的依赖——也就是说,一个 指示运行时加载器必须加载libopencv_imgproc.so 加载libMat.so时进入同一个进程。

    您的 makefile 有各种其他错误,但我所说的足以 解释并解决我认为您要问的特定问题。你 如果需要,可以通过搜索教程来学习如何编写更好的 makefile 以及关于GNU Make和学习the documentation的文章

    我只指出另一个严重的错误。你的食谱:

    clean:
        rm -f Mat2Image.h libMat.o libMat.so
    

    运行时会删除头文件Mat2Image.h make clean。该头文件是您的原始源文件之一。它 不是由这个makefile生成的——比如libMat.olibMat.so——除非 你已经省略了一些真正的makefile。所以 如果你删除它,你必须从你的源代码控制系统中恢复它;和 如果它不在源代码控制系统下,则必须重写它。所以 我想你只是想要:

    clean:
        rm -f libMat.o libMat.so
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 2021-11-07
    • 1970-01-01
    • 2017-07-31
    相关资源
    最近更新 更多