Windows/Ubuntu 环境配置

Ubuntu 配置OpenCV, Ros2, Ros

windows+vscode下进行cmake配置opencv , eigen3, fmt库, 不定期更新

Ubuntu

Ros2

CMake Error at CMakeLists.txt:4 (find_package):
By not providing "Findament_cmake_python.cmake" in CMAKE_MODULE_PATH this
project has asked CMake to find a package configuration file provided by
"ament_cmake_python", but CMake did not find one.

Could not find a package configuration file provided by
"ament_cmake_python" with any of the following names:

ament_cmake_pythonConfig.cmake
ament_cmake_python-config.cmake

Add the installation prefix of "ament_cmake_python" to CMAKE_PREFIX_PATH or
set "ament_cmake_python_DIR" to a directory containing one of the above
files. If "ament_cmake_python" provides a separate development package or
SDK, be sure it has been installed.

在编译前加 source /opt/ros/foxy/setup.bash (并将其写入gedit ~/.bashrc), 报错

没有那个文件或目录
24 | #include "rclcpp/type_adapter.hpp"

  • 手动编译安装catkin (好像没用)

  • 至此可以正常使用最基础的ros2 & cv-bridge, 但是cv-bridge只是作为一个普通的与用户编写的无异的包, 如果删除cv-bridge会导致shared-lib出问题, 然而此时ros2其他很多软件包仍未下载, (这些包有可能依赖ros2-cv-bridge然后调用apt下载他, 这之后的行为是未知的), 以及(这好像是ros2的正常过程)个人编写的包即便在编译好并且CMakeLists里install之后, 仍需手动source install/local_setup.bash才能ros2 run

  • 然后用官方的方法又安装了ros-foxy-desktop, 会导致cv_bridge_DIR导向新安装的版本(即那个用opencv4配置的版本), 如下可以再使用之前的手动编译版本

    set(cv_bridge_DIR /home/junble19768/Code/Ros/CV-Bridge/install/cv_bridge/share/cv_bridge/cmake)  # 在find_package前面
    
    # 也可以 source /home/junble19768/Code/Ros/CV-Bridge/install/local_setup.bash 达到同等效果 (gedit ~/.bashrc)
    
    

    但是目前不知道会不会有什么问题, 目前先用着, 准备处理处理rosdep的问题

  • 修改系统默认链接的cv_bridge版本号,以及查看当前系统链接的cv_bridge版本号与位置 算是一个有用的东西:

    pkg-config --modversion cv_bridge # 查看系统默认的版本
    pkg-config --cflags cv_bridge # 查看系统默认版本的路径
    
    # 然后去bashrc里修改cv-bridge的路径
    source /home/junble19768/Code/Ros/CV-Bridge/install/setup.bash
    
  • 普天同庆, rosdep换源安装, rosdep ok 了 now

Ros

依然是从除ros以外完全配置完成的地方开始

用了这个 https://blog.csdn.net/weixin_43433726/article/details/106899359 加上梯子多试了几次就弄好了rosdep

同时也看了这个 https://zhuanlan.zhihu.com/p/388629886

九折? 能汝瓷煎蛋?

Windows

VSCode 安装

没什么好说的

C++ 扩展

C/C++, C/C++ Extension Pack, C/C++ Runner, C/C++ Themes, Code Runner(选), Better C++ Syntax

CMake

CMake, CMake Language Support, CMake Tools

很重要

Doxygen Documentation Generator, Error Lens, Live Server, Ubuntu VSCode Theme

MingW-W64

这个很重要的一件事就是, 有一个什么标准选择Posix而不是Win32, 后者并不支持<thread>等库, 导致OpenCV编译会出问题, seh和sjlj好像是没什么区别

2023.3.31 更新, 去[github](Releases · niXman/mingw-builds-binaries (github.com))下载, 里面的几个前缀都是如下意思

  • i686 / x86_64 前者是32位, 后者是64位版本, 看自己机型选择就可以了
  • 12.2.0 一串数字而已, mingw-w64的版本, 没什么特殊需求的话还是选择新一点的
  • posix / win32 好像是什么线程的管理方式, 前者是Unix统一支持的, 后者是win的, 虽然这么说, win上面最好也是用posix, 原因参考上文.
  • seh / dwarf / sjlj 这是用于调试的软件, 好像没什么区别.
  • 后面几个没见过, 应该没有很大的区别

然后是记得把mingw-64\bin这个文件夹添加到环境变量

Cmake

也是随便安, 有一个选择Add CMake to the system PATH for all users就行, 安装位置随便

这个怎么用可以参考其他博客, 我就不多介绍了, 用CMake-GUI和命令行本质上是一样的, GUI好看点

Eigen

源码下载, CMake-GUI configure的时候应该有一个可以选择安装的位置叫做CMAKE_INSTALL_PREFIX, 默认是C:\Program Files (x86)\Eigen-3.4.0这个样子, 这个不知道能不能安装后移动, 所以还是先选好位置的吧. generate完之后是正常的mingw32-make, 这个过程是没有输出的, 然后mingw32-make install他会把那些东西放到刚刚的CMAKE_INSTALL_PREFIX里.

这个不需要添加任何环境变量, 不过后面会统一说一件事.

OpenCV

版本选择3.4.6, 我这边是下载的源码自己编译的, 不知道windows那个下载的能不能用(2023.3.31 更新, windows下载的那个是用于visual studio的, vscode不配呗(哭.)

还是熟悉的用cmake编译, configure完记得钩几个东西

我这里用的是mingw-w64 8.1.0编译的, 所以在这个条件下, 以下勾选可以用

2023.3.31 更新, 我用mingw-w64 12.2.0 编译opencv4.6.0, 不需要改任何选项

  • BUILD_opencv_world 这个选择性钩, 勾上生成的是一个.dll文件, 方便你手动编译, 不勾也没问题

  • ENABLE_CXX11 我是钩了, 最好勾上, 不亏(

  • WITH_OPENCL_D3D11_NV 有一个博客说不勾这个, 我之前也因为这个报错了, 所以没勾

    2023.3.31 更新, opencv4.6.0可以勾上, 不会报错了(看来是老版本的问题)

但是后面我在编fmt时因为mingw版本太低报错, 于是换了最新的mingw(12.2.0), 再编opencv的时候选择上面的三个钩的出了一些问题, 以下是解决方案:

  • 首先是一个指针用法的warning, 但是新版mingw默认把这个当成error, 所以需要在CMakeLists里的最前面加这个:

    add_compile_options(-Wno-address)
    add_compile_options(-w) # 这个是关闭所有warning的, 好像没用
    
  • 第二是链接器尝试往一个.rdata塞字节的时候超出了.rdata的容量大小, gpt告诉我应该扩容, 但是它给的扩容的cmake语句报错, 于是我把BUILD_opencv_world取消勾选就好了

  • WITH_OPENCL_D3D11_NV这个我依旧不勾, 反正目前没见过出问题, 等出问题了再说
    2023.3.30 更新, 依旧不勾

  • 2023.3.30 更新, 因为windows下没怎么用过opencv, 导致一直没有发现这个问题,

    Windows下OpenCV有关视频的读写操作都是通过ffmpeg实现的, 然而可能是因为3.4.6的OpenCV版本太老, 它当时还是通过下载ffmpeg的链接库然后编译的, 但是他给的是Github的网站, 下载失败, 然后它自动把ffmpeg给取消了! 所以生成的OpenCV是没有ffmpeg的, 导致读写视频会出问题. 这个在比较新的OpenCV版本好像已经解决了

    解决办法就是手动下载一下他要的东西.[参考csdn](cmake 编译opencv 缺失opencv_ffmpeg.dll 、 opencv_ffmpeg_64.dll、ffmpeg_version.cmake等问题_三无野指针的博客-CSDN博客)

    这是你build文件夹下CMakeDownloadLog.txt

    #use_cache "C:/Dev/Resource/opencv-3.4.6/.cache"
    #match_hash_in_cmake_cache "OCV_DOWNLOAD_FFMPEG_HASH_3rdparty_ffmpeg_opencv_ffmpeg_dll"
    #match_hash_in_cmake_cache "OCV_DOWNLOAD_FFMPEG_HASH_3rdparty_ffmpeg_opencv_ffmpeg_64_dll"
    #do_copy "ffmpeg_version.cmake" "3b90f67f4b429e77d3da36698cef700c" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/fe71c0ad807fdc33c2178e48e488f1e9b177c39a/ffmpeg/ffmpeg_version.cmake" "C:/Dev/opencv-3.4.6/3rdparty/ffmpeg"
    #missing "C:/Dev/opencv-3.4.6/3rdparty/ffmpeg/ffmpeg_version.cmake"
    #check_md5 "C:/Dev/Resource/opencv-3.4.6/.cache/ffmpeg/3b90f67f4b429e77d3da36698cef700c-ffmpeg_version.cmake"
    #mismatch_md5 "C:/Dev/Resource/opencv-3.4.6/.cache/ffmpeg/3b90f67f4b429e77d3da36698cef700c-ffmpeg_version.cmake" "d41d8cd98f00b204e9800998ecf8427e"
    #delete "C:/Dev/Resource/opencv-3.4.6/.cache/ffmpeg/3b90f67f4b429e77d3da36698cef700c-ffmpeg_version.cmake"
    #cmake_download "C:/Dev/Resource/opencv-3.4.6/.cache/ffmpeg/3b90f67f4b429e77d3da36698cef700c-ffmpeg_version.cmake" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/fe71c0ad807fdc33c2178e48e488f1e9b177c39a/ffmpeg/ffmpeg_version.cmake"
    # timeout on name lookup is not supported
    # getaddrinfo(3) failed for raw.githubusercontent.com:443
    # Couldn't resolve host 'raw.githubusercontent.com'
    # Closing connection 0
    # 
    

    就是在这里第四行那个do_copy, 后面那个github的地址就是我们要下载的东西, 下载后这个文件放到第六行那个check_md5路径上, 记得名字也改一下, 我这里是已经下两个了, 你们那里应该有三个, 都要下载

    下载.cmake注意一下直接访问那个地址会显示内容, 用浏览器直接ctrl+s就行, 不要复制, 复制会少一个换行, 导致cmake在hash的时候对不上重新下载.

    下载后再configure一下就好了. 我这边应该是好了

    Win+OpenCV你真的该死啊!

    为什么我会想在win下搞opencv((()))

    建议用wsl2了

  • 2023.3.31 更新, 4.6.0在用cmake编译的时候也会警告ffmpeg下载失败, 我这边顺带就下载了, 不知道如果不下载的话会怎么样, 然后正常的按流程走, WITH_OPENCL_D3D11_NV 这个选项在opencv4.6.0可以勾选, 我这里没报错, 同时它自己选择了c++11, 也就是说opencv4.6.0在用cmake编译的时候一路绿灯, 没什么需要改的就可以了, 记得加环境变量, 算上后文的使用方式, opencv总共要在高级系统设置里面加两个东西, 现在可以读取本地视频了, 后续出了什么问题再说.

然后generate, 然后进build的文件夹里mingw32-make -j8, mingw32-make install, 这个install是必须的, 他会在build文件夹里生成一个install文件夹, 里面是用于cmake调用的东西, 很重要!

然后是需要添加一个环境变量, 看图吧, 这个文件夹里应该会有一些.cmake文件

怎么用

前面的步骤里理论上只生成了一些文件, 所以如果不用了想卸载的话, 直接把对应的文件和环境变量删除就可以了.

我们用cmake编译项目, cmake总体需要的东西分别是头文件和链接库, 理论上我们只需要把这两个东西给cmake就可以用cmake编译了, 然后如果是我们用cmake编译的库, 它一般会生成一些cmake自己用的配置文件, 有这个配置文件我们就可以更方便的使用库.

我们可以用如下的CMakeLists.txt来给代码里加上OpenCVEigen

cmake_minimum_required(VERSION 3.10)
project(Untitled)


set(OpenCV_DIR "C:\\Dev\\opencv-3.4.6\\install")
set(Eigen3_DIR "C:\\Dev\\Eigen3\\share\\eigen3\\cmake")
find_package(OpenCV REQUIRED)
find_package(Eigen3 REQUIRED)
# message(STATUS "OpenCV library status:")
# message(STATUS "    version: ${OpenCV_VERSION}")
# message(STATUS "    libraries: ${OpenCV_LIBS}")
# message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
# message(STATUS "    shitshit  include path: ${EIGEN3_INCLUDE_DIR}")
set(CMAKE_CXX_STANDARD 14)
include_directories(${OpenCV_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR} ${EIGEN3_INCLUDE_DIR})

add_executable(main main.cpp)
target_link_libraries(main ${OpenCV_LIBS})

可以看到我们前面set的两个文件夹里面是.cmake文件, 然后我们直接find_package就可以了, 当然后面记得加上include_directories, 有链接库的还需要target_link_libraries, 这就很完整了.

当然还有一件小事, 我们不是时时刻刻都记得自己的头文件放哪了的, 所以对于这两行其实大部分时间很烦人

set(OpenCV_DIR "C:\\Dev\\opencv-3.4.6\\install")
set(Eigen3_DIR "C:\\Dev\\Eigen3\\share\\eigen3\\cmake")

这就要用到环境变量了.

我们可以用环境变量新建两个变量, 代替刚刚CMakeList里的行为(注意这里不是放到path里, 而是新建变量).如上.

这种方式(好像其他方式也会)会导致第一次打开vscode的时候给你报错说没找到头文件, 但是make一次就应该好了

再次很重要的事情, 不要嫌给系统添乱就不加环境, 之后如果有其他库也需要这些库的话, 你是不会去改里面的CMakeLists的, 所以建议使用系统变量的方法

以及来自CMake——第三方库引入 - 简书 (jianshu.com)的总结:

1.对于有.cmake的第三方库:
list(APPEND CMAKE_PREFIX_PATH "./thirdParty/opencv/build")  #.cmake所在路径  find_package(OpenCV REQUIRED)                                                            add_executable(project main.cpp)
target_link_libraries(project ${OpenCV_LIBS})                                 #将exe与第三方库链接

2.对于需要源码编译(例如src文件夹中含有一堆.h,.cpp文件等)
file(GLOB_RECURSE <变量名> "src/.hpp" "src/.cpp" "src/.h" "src/.c") 
add_library(<库名> STATIC ${变量名})         

3.对于已经编译好的第三方库
add_library(<库名> INTERFACE IMPORTED)     #将已编译好的include和lib封装成你想要的库target_include_directories(<库名> INTERFACE <include文件夹所在路径>)
target_link_directories(<库名> INTERFACE <lib文件夹所在路径>)
target_link_libraries(<库名> INTERFACE <需要的.lib文件>)

4.将很多第三方库统一放在一个文件夹 “thirdparty” 下
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set_target_properties(<库名> PROPERTIES FOLDER "thirdparty")

fmt

这个勾八东西已经在C++20加入了标准库里, 所以即将是时代的眼泪的cmake配置fmt方式Q_Q. 但是Sophus库偏偏还用了它, 所以没办法.

直接去github上down一个源码下来就行, 然后打开cmake-gui, 这里和eigen3差不多, 它也有一个默认的安装了路径, 这个可以改成你喜欢的位置, 然后mingw32-make和install, 然后去系统变量里添加一个名叫fmt_DIR, 值是C:\Dev\FMT\lib\cmake\fmt这个样子的变量, 配置就搞完了

使用方式

fmt和其他库有所不同, 它可以只包含头文件,不包含实现代码。因此,在使用TARGET_LINK_LIBRARIES命令将其添加到目标中时,它实际上只是将该库的头文件路径添加到项目的编译器选项中,以便在编译时能够找到该库的头文件。

需要注意的是,INTERFACE库不能像常规库那样被链接。因此,在将其添加为依赖项时,需要使用INTERFACE关键字,如下所示:

TARGET_LINK_LIBRARIES(mylib INTERFACE fmt::fmt-header-only)

但是不知道为什么我这里没这么用也过编译了, 以下是我的cmakelists文件

cmake_minimum_required(VERSION 3.10)
project(Untitled)
set(CMAKE_CXX_STANDARD 14)

find_package(OpenCV REQUIRED)
find_package(Eigen3 REQUIRED)
find_package(fmt)

include_directories(${OpenCV_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR} ${EIGEN3_INCLUDE_DIR})


add_executable(main main.cpp)
target_link_libraries(main PUBLIC fmt::fmt-header-only ${OpenCV_LIBS})

另外

如果你感觉自己做的没问题了, 但是还是报错, 那么建议把vscode或者命令行关掉再开, 或者CMake给你索引到一个不存在的目录里了, 那么「就当是为了我, 删掉build文件夹吧 !」

posted @ 2023-03-12 21:45  Junble  阅读(186)  评论(0)    收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css