C ++:错误:opencv_core:即使所需的.so文件位于/ usr / lib /中,也没有这样的文件或目录

时间:2017-06-14 15:10:16

标签: c++ linux opencv cmake linker

我正在尝试从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。

但这也没有帮助。

1 个答案:

答案 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 ...)可能会提供不同的东西,我有一个自定义的提升编译,所以我不确定。但是用完整的例子我会说

  1. 确保找到boost正确。
  2. 如果这些变量中已包含l l boost_system),您应该担心。
  3. list(APPEND LIBS是比set更安全的替代方案,它也适用于OpenCV_LIBS
  4. 希望其中一个能让你朝着正确的方向前进!