Cmake opencv遇到问题

D:/opencv/sources/3rdparty/openexr/IlmThread/IlmThreadMutex.h:131:20: error: 'mutex' in namespace 'std' does not name a type
 using Mutex = std::mutex;
                    ^~~~~
D:/opencv/sources/3rdparty/openexr/IlmThread/IlmThreadMutex.h:138:17: error: 'Mutex' does not name a type; did you mean 'putenv'?
     Lock (const Mutex& m, bool autoLock = true):
                 ^~~~~
                 putenv
D:/opencv/sources/3rdparty/openexr/IlmThread/IlmThreadMutex.h:173:5: error: 'Mutex' does not name a type; did you mean
putenv'?
     Mutex & _mutex;
     ^~~~~
     putenv
D:/opencv/sources/3rdparty/openexr/IlmThread/IlmThreadMutex.h: In constructor 'IlmThread_opencv::Lock::Lock(const int&, bool)':
D:/opencv/sources/3rdparty/openexr/IlmThread/IlmThreadMutex.h:139:9: error: class 'IlmThread_opencv::Lock' does not have any field named '_mutex'
         _mutex (const_cast<Mutex &>(m)), _locked (false)
         ^~~~~~
D:/opencv/sources/3rdparty/openexr/IlmThread/IlmThreadMutex.h:139:28: error: 'Mutex' does not name a type; did you mean 'putenv'?
         _mutex (const_cast<Mutex &>(m)), _locked (false)

你用的什么版本的还有在什么环境下运行的

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你看下这篇博客吧, 应该有用👉 :cmake opencv
  • 除此之外, 这篇博客: 编译链接、cmake和编译opencv中的 编译、连接与库 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    首先,编译连接的基本概念我事先是有的但是有些问题没有搞清楚。

    1.静态链接库和动态连接库的区别

    首先库就分动态连接库和静态连接库。比如说在程序里调用了一段第三方库的程序,
    假如它是静态连接库的话,那在调用这段程序的时候就会把这段第三方库的程序编译后的部分插入到原先程序的编译后的程序中间,也就是所谓的连接,相当于在原先的程序上增加了一段代码。
    假如它是动态连接库的话,则有所不同首先一个问题,动态连接后第三方库是放在其他位置而不是添加在原先的程序中间,而且并不是链接的阶段添加程序而是在运行阶段载入链接,这样带来一个好处是如果多次调用这个程序并不会增加原先程序的代码量。
    
    两者的区别:
    静态链接库的优点是在运行阶段不需要额外的动态连接库,缺点是当原先第三方库有修改或者升级的时候必须重新编译
    动态链接库的优缺点与静态链接库相对,升级的时候只要重新编译原先的动态链接库,在放回原先的位置就行,或者通过超链接的方式替换原先的链接库名字就行,不需要重新编译整个程序,升级比较容易。
    

    2.linux下连接库的编译

    在ubuntu下通常来说很多软件或者库都是apt-get来安装的,如果是从源码编译的换通常来说大概就是简单的几步:
    cd <source-dir>
    mkdir build & cd build
    cmake ..//可以加入编译的可选命令
    make //在当前目录编译
    make install//把编译后的程序安装,通常默认的位置是/usr下或者/usr/local
    

    通常/usr或者/usr/local有几个相同的文件夹
    /bin//一般放可以运行的程序
    /include//一般放头文件
    /lib//一般放动态链接库。.so等

    当然这只是通常来说的情况。也有人把把程序编译后的动态链接库放到自己的主文件夹下,这样通常来说都是类似这样的目录结构
    ~/local/bin
    ~/local/include
    ~/local/lib
    这样做有些问题需要说明首先很多这样写程序调用动态链接库里的程序后发现没有办法找到动态连接库,这是因为少做了一步,在/etc/ld.so.conf.d/下添加一个.conf文件,比如说opencv.conf然后再opencv.conf中间添加动态连接库的路径如/home/zhaoch93/local/lib/。保存后在终端运行 sudo ldconfig才行。这个路径下面保存了linux默认的动态链接库的地址,并按照它自己的组织方式保存内容。当然你也可以选择通过ide添加动态连接库。
    比如说:
    sudo /bin/bash -c ‘echo “/usr/local/lib” > /etc/ld.so.conf.d/opencv.conf’
    sudo ldconfig

    如果说头文件找不到的话就在ide里面的include路径添加~/local/include目录就好啦。

  • 以下回答来自chatgpt:

    对于在CMake中添加OpenCV库路径和链接的问题,可以根据项目具体情况选择以下几种方式:

    1. 使用find_package命令和OpenCVConfig.cmake文件

    在CMakeLists.txt文件中添加以下代码,即可使用find_package命令寻找指定版本的OpenCV库,并添加路径和链接:

    set(OpenCV_DIR /path/to/OpenCVConfig.cmake)
    find_package(OpenCV REQUIRED)
    include_directories(${OpenCV_INCLUDE_DIRS})
    target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
    

    其中,/path/to/OpenCVConfig.cmake需要指定对应OpenCV版本的配置文件路径。

    1. 使用静态导入库的方式

    在CMakeLists.txt文件中添加以下代码,可以使用add_library和set_target_properties导入需要的OpenCV库,并在target_link_libraries中链接:

    add_library(opencv_core STATIC IMPORTED)
    set_target_properties(opencv_core PROPERTIES IMPORTED_LOCATION /path/to/libopencv_core.a)
    
    add_executable(my_project main.cpp)
    target_link_libraries(my_project opencv_core)
    

    其中,/path/to/libopencv_core.a需要指定对应的OpenCV库路径。需要添加的库可以根据项目具体需要自行添加。

    1. 使用预编译的libopencv_java.so库

    对于需要使用OpenCV的全部功能的项目,可以使用官方预编译的libopencv_java.so库。在CMakeLists.txt文件中添加以下代码:

    add_library(opencv_java SHARED IMPORTED)
    set_target_properties(opencv_java PROPERTIES IMPORTED_LOCATION /path/to/libopencv_java.so)
    
    add_executable(my_project main.cpp)
    target_link_libraries(my_project opencv_java)
    

    其中,/path/to/libopencv_java.so需要指定对应的库路径。

    以上三种方式均可成功添加OpenCV库路径和链接。需要根据具体情况选择适合的方式。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^