0 背景

因为需要使用cmake来进行跨平台编译,所以根据网上的资料学习和总结成此文。

1 安装CMake

## 1. 查看当前cmake版本
[root@localhost ~]# cmake -version
cmake version 2.8.12.2
## 2. 进行卸载
[root@localhost ~]# yum remove -y cmake
## 3. 进行安装包的下载,也可以下载好安装包后传至相应的目录
[root@localhost ~]# mkdir /opt/cmake
[root@localhost ~]# cd /opt/cmake/
## 4. 下载或拷贝,解压
[root@localhost cmake]# wget https://cmake.org/files/v3.16/cmake-3.16.6.tar.gz
[root@localhost cmake]# tar -zxvf cmake-3.16.6.tar.gz
## 5. 安装基本工具
[root@localhost cmake]# yum install -y gcc gcc-c++  
## 6. 进行编译连接
[root@localhost cmake]# cd cmake-3.16.6  && ./configure --prefix=/usr/local/cmake
## 7. 安装
[root@localhost cmake-3.16.6]# make && make install 
## 8. 创建链接
[root@localhost cmake-3.16.6]# ln -s /usr/local/cmake/bin/cmake /usr/bin/cmake 
## 9. 查看版本
[root@localhost cmake-3.16.6]# cmake -version
cmake version 3.16.6

CMake suite maintained and supported by Kitware (kitware.com/cmake).

升级gcc/g++,如果不升级,可能会遇到@GLIBCX的问题。

yum -y install centos-release-scl

yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils

scl enable devtoolset-9 bash  #启动gcc9

你要哪个版本的就把第2条命令中的数字8改成你要的主版本号就可以了。这样升级到的是最新的版本。例如8升级到的是8.2.0而不是8.1。

通过scl命令启动gcc,这个只是暂时的,当你的shell关闭后或者重启就会恢复原来的版本,要想一直使用升级后的版本可以使用如下命令:

echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile

2 使用CMakefile.txt编译C++程序

示例的CMakeLists.txt的文件如下(以下的测试例子,在mac和linux上均运行成功):

# 设置cmake版本
cmake_minimum_required(VERSION 3.15)

# 设置项目名 
project(getMatInfo)

# 设置c++版本
set(CMAKE_CXX_STANDARD 11)

# 设置工作路径
include_directories(${PROJECT_SOURCE_DIR})
include_directories(.)

# 动态链接opencv
find_package(OpenCV REQUIRED)
include_directories( ${OpenCV_INCLUDE_DIRS})

# 打印变量信息
# MESSAGE( STATUS "opencv lib = ${OpenCV_LIBS}.")
# STATUS = 非重要消息;
# WARNING = CMake 警告, 会继续执行;
# AUTHOR_WARNING = CMake 警告 (dev), 会继续执行;
# SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤;
# FATAL_ERROR = CMake 错误, 终止所有处理过程;


# 链接动态链接库(方法1)
# linux下的目录(/usr/local/Polyspace/R2021a/bin/glnxa64/)
LINK_LIBRARIES("/Applications/MATLAB_R2022a.app/bin/maci64/libeng.dylib"
        "/Applications/MATLAB_R2022a.app/bin/maci64/libmx.dylib"
        "/Applications/MATLAB_R2022a.app/bin/maci64/libmat.dylib"
        "/Applications/MATLAB_R2022a.app/bin/maci64/libmex.dylib")

# 链接动态链接库(方法2)
#LINK_DIRECTORIES(/Applications/MATLAB_R2022a.app/bin/maci64)

# 编译运行文件(和编译动态链接库,只能存在一个)
// add_executable(getMatInfo
//        getMatInfo.h
//        getMatInfo.cpp)   
 
 # 编译动态链接库
 # 如果不填写SHARE,默认为静态链接库,或者把SHARED替换为STATIC
 add_library(getMatInfo SHARED
        getMatInfo.h
         getMatInfo.cpp)

# 链接动态链接库(方法2)
#target_link_libraries(getMatInfo  mx mat mex eng )
#target_link_libraries(getMatInfo  -lmx -lmat -lmex -leng )
#target_link_libraries(getMatInfo  libeng.dylib libmx.dylib libmat.dylib libmex.dylib)

#动态链接opencv
target_link_libraries(dealImage ${OpenCV_LIBS} )
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐