c++ - 如何将库集成到我的库中
问题描述
我制作了自己的使用 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 给我发送了黑色图像:(
Edit2:这太疯狂了,事实上,只要我使用 tensorlow 对象,VideoCapture 就会向我发送黑色图像......这可能来自 tensorflow 库编译吗?
解决方案
如果您使用未正确链接的库,您甚至不会获得可执行文件。
这应该有帮助
推荐阅读
- python - 如何根据字典中的键合并数据,同时在 Python 的输出中保留键?
- asp.net-core - 如何扩展服务器端 Blazor 应用程序?
- javascript - 引导滑块如何将工具提示值移动到外部?
- python - 从python中的二维数组列表中选择一个随机元素
- python-3.x - 如何在flask-restful中实现多维度查询资源?
- c - c中的两个语句有什么区别?
- swiftui - 被 TabView 隐藏的 UIView
- python - 如何解决 Selenium 异常:“无效参数 'url' 必须是字符串”
- kubernetes - 使用命令行创建持久卷(不使用任何文件)
- c# - 如何在 Xamarin Forms 中向 com.sec.android.provider.badge.BadgeProvider uri content://com.sec.badge/apps 添加权限