如何将库集成到我的库中

Posted

技术标签:

【中文标题】如何将库集成到我的库中【英文标题】:How to integrate library into my library 【发布时间】:2018-08-21 19:55:47 【问题描述】:

我创建了自己的库,使用 Opencv 和其他库。这里是

CMakelists.txt of my library:

cmake_minimum_required(VERSION 3.0)

project("face_module")

add_definitions("-std=c++11" "-Wno-write-strings")

file(GLOB_RECURSE SOURCES "*.cpp"")
file(GLOB_RECURSE HEADERS "*.h"")
add_library("face_module" SHARED $SOURCES $HEADERS)
target_include_directories(
    "face_module" PUBLIC "include" )

find_package(OpenCV 3.2.0 REQUIRED)
find_package(jsoncpp REQUIRED)

set( JSONCPP_LIBRARIES    jsoncpp curl )
SET(OpenCV_LIBS  opencv_core opencv_highgui opencv_videoio opencv_imgproc opencv_imgcodecs )

target_link_libraries("face_module"
    "$CMAKE_CURRENT_LIST_DIR/lib/tensorflow/libtensorflow.so"
    "$CMAKE_CURRENT_LIST_DIR/lib/tensorflow/libtensorflow_framework.so"
    $OpenCV_LIBS
    $JSONCPP_LIBRARIES
    pthread)

我在我的程序中使用了那个库和 Opencv:

cmake_minimum_required(VERSION 3.0)

project("database_generator")

add_definitions("-std=c++11" )

file(GLOB SOURCES  "database_generator.cpp")
file(GLOB HEADERS "")

add_executable("database_generator" $SOURCES $HEADERS)
target_link_libraries("database_generator"
 "face_module")

当我在我的 database_generator 项目中使用 OpenCV VideoCapture 时,网络摄像头向我发送了黑色图像。我不明白为什么会这样。 正如您在 database_generator 的 CmakeLists.txt 中看到的那样,我没有添加 Opencv 库,因为它也在我的 face_module 库中添加。

在我的库生成过程中,我做了哪些糟糕的事情?

这是我的database_generator的主文件

int main(int argc, char **argv) 
    cv::VideoCapture *video_capture = new cv::VideoCapture(0);

    if (!video_capture->isOpened()) 
        std::cerr << "Can't open camera " << 0 << std::endl;
    

    while(1) 
        cv::Mat u8x3_image;

        *video_capture >> u8x3_image;
        std::cout << "lalal"<< u8x3_image.empty() << std::endl;
        cv::imshow("facedetector", u8x3_image);
        cv::waitKey(100);
    

使用前面的代码,摄像头向我发送正常图像,但是一旦我使用我的库的一个类,网络摄像头发送的图像是黑色的......

编辑: 我也尝试在我的库中做所有事情,我只是生成一个可执行文件(没有库)

project("database_generator2")

add_definitions("-std=c++11" )

file(GLOB_RECURSE SOURCES "*.cpp"  "../module/database_generator.cpp")
file(GLOB_RECURSE HEADERS "*.h" )
add_executable("database_generator2" $SOURCES $HEADERS)
target_include_directories(  "database_generator2" PUBLIC "include" )

find_package(OpenCV 3.2.0 REQUIRED)
find_package(jsoncpp REQUIRED)

set( JSONCPP_LIBRARIES    jsoncpp curl )
SET(OpenCV_LIBS  opencv_core opencv_highgui opencv_videoio opencv_imgproc opencv_imgcodecs )

target_link_libraries("database_generator2"
    "$CMAKE_CURRENT_LIST_DIR/lib/tensorflow/libtensorflow.so"
    "$CMAKE_CURRENT_LIST_DIR/lib/tensorflow/libtensorflow_framework.so"
    $OpenCV_LIBS
    $JSONCPP_LIBRARIES
    pthread)

我也有同样的问题,所以问题不是由于库生成。 我认为它来自 tensoflow 库 libtensorflow_framework.so libtensorflow.so 但我不明白为什么。

    libtensorflow_framework.so:
    linux-vdso.so.1 =>  (0x00007fff575d2000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7afda2b000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7afd722000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7afd505000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f7afd183000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f7afcf6d000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7afcba3000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f7afe7f9000)
libtensorflow.so:
    linux-vdso.so.1 =>  (0x00007ffc32ba1000)
    libtensorflow_framework.so => /home/xavier/Desktop/developpement/Network/pam_face_module/library/lib/tensorflow/./libtensorflow_framework.so (0x00007f0bc5a55000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f0bc5851000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0bc5634000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0bc532b000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f0bc4fa9000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f0bc4d93000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0bc49c9000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f0bc9233000)

这真的很奇怪,因为 opencv 的 imread 功能正常工作,但 VideoCapture 给我发送黑色图像:(

编辑2: 太疯狂了,事实上,只要我使用 tensorlow 对象,VideoCapture 就会向我发送黑色图像......这可能来自 tensorflow 库编译吗?

【问题讨论】:

【参考方案1】:

如果您使用未正确链接的库,您甚至不会获得可执行文件。

这应该会有所帮助

http://answers.opencv.org/question/129659/i-want-to-read-image-captured-by-webcam-videocapture-and-write-that-to-some-external-file/

【讨论】:

以上是关于如何将库集成到我的库中的主要内容,如果未能解决你的问题,请参考以下文章

我需要使用 javascript 将库添加到我的项目中

如何使用 Flash JavaScript 文件 (.jsfl) 将库中的对象添加到舞台?

如何将库添加到我的.jar文件中

ios 库中的 Libxml

将库导入我的 c++ 项目时出现问题,如何解决?

Android/Eclipse:如何嵌入 .jar 文件?