我正在尝试从github编译一个依赖于Opencv的项目。
我知道opencv_core文件必须是"已知"由编译器。在我的情况下,我通过apt-get安装了opencv,因此所需的.so
和.a
文件都在
/usr/lib/x86_64-linux-gnu/
为了检查编译器是否真正查看了它,我检查了目录
/etc/ld.so.conf.d/
x86_64-linux-gnu.conf
文件在哪里,具有如上所述的正确路径。此外,我创建了一个opencv.conf文件,其中我写了与.so
文件完全相同的路径。
如果我查看CMakeFile,OpenCV包含如下:
find_package(OpenCV QUIET REQUIRED COMPONENTS core highgui)
if(OpenCV_FOUND)
message("Found OpenCV")
include_directories(${OpenCV_INCLUDE_DIRS})
set(LIBS ${LIBS} ${OpenCV_LIBS})
endif(OpenCV_FOUND)
add_library(${PROJECT_NAME} src/Simulator.cpp src/noiseutils.cpp)
target_link_libraries(${PROJECT_NAME} assimp CGAL noise ${LIBS})
add_executable(object src/main.cpp)
target_link_libraries(object ${PROJECT_NAME})
当我发消息${LIBS}
时,我得到以下内容:
lboost_system opencv_coreopencv_highgui
这对我来说似乎是正确的。
但是在运行cmake之后,执行make会出现以下错误:
链接CXX可执行文件../bin/object
c ++:错误:opencv_core:没有这样的文件或directroy
后面是usuual make error输出。
这对我来说似乎很奇怪,因为链接器应该知道文件的位置,因为.conf
文件。
我还尝试更新LD_LIBRRAY_PATH
,因此它现在包含.so
文件的路径并执行sudo ldconfig
命令,但这没有帮助。
看到后,该错误是由" object
" - 可执行文件我将最后一行更改为:
target_link_libraries(object ${PROJECT_NAME} ${LIBS})
认为它可能也需要来自LIBS的标志 - 但是这并没有解决这个问题。
我不知道该怎么做,非常感谢你的帮助。
我还尝试将find_package
命令更改为以下行:
find_package(OpenCV QUIET REQUIRED COMPONENTS core highgui PATHS /usr/lib/x86_64-linux_gnu NO_DEFAULT_PATH)
我试图安装一个新版本的cmake,但没有帮助。
我在运行Xubuntu的服务器上使用Docker-Image。
但这也没有帮助。
答案 0 :(得分:1)
这很可能不是你的问题,但我怀疑${LIBS}
变量的格式是问题所在:
lboost_system opencv_coreopencv_highgui
^ XX
有一个空格^
,opencv库之间没有空格。我系统上的最小版本:
cmake_minimum_required(VERSION 3.0.0)
project(hello)
find_package(OpenCV QUIET REQUIRED COMPONENTS core highgui)
if(OpenCV_FOUND)
message("Found OpenCV")
include_directories(${OpenCV_INCLUDE_DIRS})
set(LIBS ${LIBS} ${OpenCV_LIBS})
endif(OpenCV_FOUND)
message(STATUS "The libraries: ${LIBS}") # important line
我的重要输出线:
-- The libraries: opencv_core;opencv_highgui
^
因为对我来说${LIBS}
还没有价值。您可能会混淆表示事物,列表或字符串的方式。根据我的经验,更喜欢列表(依赖;
作为分隔符)。所以现在(按照相反的顺序并在之后找到提升),我可以在上面添加:
find_package(Boost QUIET REQUIRED COMPONENTS system)
if(Boost_FOUND)
list(APPEND LIBS "${Boost_LIBRARIES}")
endif()
message(STATUS "With boost: ${LIBS}")
我现在打印了以下内容:
v v
-- With boost: opencv_core;opencv_highgui;/long/path/to/my/lib/libboost_system-mt.so
你的find_package(Boost ...)
可能会提供不同的东西,我有一个自定义的提升编译,所以我不确定。但是用完整的例子我会说
boost
正确。l
( l
boost_system
),您应该担心。list(APPEND LIBS
是比set
更安全的替代方案,它也适用于OpenCV_LIBS
!希望其中一个能让你朝着正确的方向前进!