代码之家  ›  专栏  ›  技术社区  ›  Sebastian Yonekura Baeza

用OpenCV作为C++外部的C++项目

  •  0
  • Sebastian Yonekura Baeza  · 技术社区  · 6 年前

    我对cmake还不熟悉,过几天就想不出怎么做到。

    我试图建立一个C++项目,它依赖于使用cFug的OpenCV,但是我想让Cube克隆并安装它。 this . 我找到一个 project's CMakeFile 我用它来做参考。所以我有这个:

    #include <iostream>
    #include <opencv2/opencv.hpp>
    
    
    int main() {
        std::cout << "OpenCV Version: " + cv::getVersionString() << std::endl;
        return 0;
    }
    

    CMakeLists.txt:

    cmake_minimum_required(VERSION 3.12)
    project(cv_playground)
    set(CMAKE_CXX_STANDARD 14)
    
    find_package(Git REQUIRED)
    
    include(ExternalProject)
    
    # OpenCV
    set(OPENCV_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/opencv)
    ExternalProject_Add(opencv
            GIT_REPOSITORY https://github.com/opencv/opencv
            GIT_TAG 68942affdbc4677aa845bc4307d4752182324a0e # 4.0.0-alpha
            SOURCE_DIR opencv
            BINARY_DIR opencv-build
            CMAKE_ARGS
              -DCMAKE_INSTALL_PREFIX=${OPENCV_INSTALL_LOCATION}
            )
    include_directories(${OPENCV_INSTALL_LOCATION}/include/opencv4)
    link_directories(${OPENCV_INSTALL_LOCATION}/lib)
    
    add_executable(cv_playground main.cpp)
    add_dependencies(cv_playground opencv)
    target_link_libraries(cv_playground opencv_core opencv_dnn opencv_features2d opencv_flann opencv_highgui opencv_imgcodecs)
    

    但是在构建项目时,我得到了很多未定义的引用(pthread、gz、dlopen/dlclose、itt-domain-create-ptr等)

    我想知道如何修复这些undef引用,我已经安装了pthread、zlib等,但我不知道如何让cmake使用它们。我试着把它们加到 target_link_libraries 例如,但仍然会给我同样的错误:

    CMakeLists.txt(注意目标链接库中的CMAKE-DL-LIBS):

    cmake_minimum_required(VERSION 3.12)
    project(cv_playground)
    set(CMAKE_CXX_STANDARD 14)
    set(THREADS_PREFER_PTHREAD_FLAG ON)
    
    find_package(Threads REQUIRED)
    find_package(Git REQUIRED)
    
    include(ExternalProject)
    
    # OpenCV
    set(OPENCV_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/opencv)
    ExternalProject_Add(opencv
            GIT_REPOSITORY https://github.com/opencv/opencv
            GIT_TAG 68942affdbc4677aa845bc4307d4752182324a0e # 4.0.0-alpha
            SOURCE_DIR opencv
            BINARY_DIR opencv-build
            CMAKE_ARGS
              -DWITH_OPENGL=OFF
              -DCMAKE_INSTALL_PREFIX=${OPENCV_INSTALL_LOCATION}
            )
    include_directories(${OPENCV_INSTALL_LOCATION}/include/opencv4)
    link_directories(${OPENCV_INSTALL_LOCATION}/lib)
    
    add_executable(cv_playground main.cpp)
    add_dependencies(cv_playground opencv)
    target_link_libraries(cv_playground Threads::Threads ${CMAKE_DL_LIBS} opencv_core opencv_dnn opencv_features2d opencv_flann opencv_highgui opencv_imgcodecs)
    

    错误消息(仍获取对dlopen、dlclose…的未定义引用)

    [ 90%] Linking CXX executable cv_playground
    /home/syonekura/CLionProjects/cv_playground/cmake-build-debug/opencv/lib/libopencv_core.a(system.cpp.o): In function `cv::TLSData<cv::(anonymous namespace)::ThreadID>::createDataInstance() const':
    system.cpp:(.text._ZNK2cv7TLSDataINS_12_GLOBAL__N_18ThreadIDEE18createDataInstanceEv+0x37): undefined reference to `__itt_thread_set_name_ptr__3_0'
    /home/syonekura/CLionProjects/cv_playground/cmake-build-debug/opencv/lib/libopencv_core.a(opencl_core.cpp.o): In function `GetHandle(char const*)':
    opencl_core.cpp:(.text._ZL9GetHandlePKc+0x7): undefined reference to `dlopen'
    opencl_core.cpp:(.text._ZL9GetHandlePKc+0x1e): undefined reference to `dlsym'
    opencl_core.cpp:(.text._ZL9GetHandlePKc+0x53): undefined reference to `dlclose'
    /home/syonekura/CLionProjects/cv_playground/cmake-build-debug/opencv/lib/libopencv_core.a(opencl_core.cpp.o): In function `opencl_check_fn(int)':
    opencl_core.cpp:(.text._ZL15opencl_check_fni+0x3f): undefined reference to `dlsym'
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Philip Bal    6 年前

    所以我自己也有很多问题。Cmake本质上应该只用于构建OpenCV库。如果您使用的是ubuntu机器,那么您需要这样做:

    # Update and upgrade packages
    sudo apt-get -y update
    sudo apt-get -y upgrade
    
    # Remove any existing versions of x264
    sudo apt-get remove x264 libx264-dev
    
    # Install OS Libraries
    
    # Install Dependencies
    sudo apt-get -y install build-essential checkinstall cmake pkg-config yasm gfortran git
    sudo apt-get -y install libjpeg8-dev libjasper-dev libpng12-dev
    # Used for Ubuntu 16.04
    sudo apt-get -y install libtiff5-dev
    sudo apt-get -y install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev
    sudo apt-get -y install libxine2-dev libv4l-dev
    sudo apt-get -y install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
    sudo apt-get -y install libqt4-dev libgtk2.0-dev libtbb-dev
    sudo apt-get -y install libatlas-base-dev
    sudo apt-get -y install libfaac-dev libmp3lame-dev libtheora-dev
    sudo apt-get -y install libvorbis-dev libxvidcore-dev
    sudo apt-get -y install libopencore-amrnb-dev libopencore-amrwb-dev
    sudo apt-get -y install x264 v4l-utils
    
    # Install Optional Dependencies
    sudo apt-get -y install libprotobuf-dev protobuf-compiler
    sudo apt-get -y install libgoogle-glog-dev libgflags-dev
    sudo apt-get -y install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen
    
    # Download OpenCV from Github
    git clone https://github.com/opencv/opencv.git
    cd opencv
    git checkout 3.3.0
    cd ..
    
    # Download opencv_contrib from Github
    git clone https://github.com/opencv/opencv_contrib.git
    cd opencv_contrib
    git checkout 3.3.0
    cd ..
    
    # Compile and Install OpenCV with contrib
    # Create build directory inside opencv directory
    cd opencv
    mkdir build
    cd build
    
    # Run CMake with the following options
    cmake -D CMAKE_BUILD_TYPE=RELEASE \
          -D CMAKE_INSTALL_PREFIX=/usr/local \
          -D INSTALL_C_EXAMPLES=ON \
          -D INSTALL_PYTHON_EXAMPLES=ON \
          -D WITH_TBB=ON \
          -D WITH_V4L=ON \
          -D WITH_QT=ON \
          -D WITH_OPENGL=ON \
          -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
          -D BUILD_EXAMPLES=ON ..
    
    # Compile and Install
    make -j4
    sudo make install
    sudo sh -c 'echo "/usr/local/lib" >> /etc/ld.so.conf.d/opencv.conf'
    sudo ldconfig
    

    c类++ pkg-config --cflags opencv 文件名.cpp pkg-config --libs opencv -o文件名