【C++学习】一个用于交叉编译的cmakelist编写

本cmakelist包含5个功能:
1、加载opencv动态库;
2、加载第三方静态库;
3、多路径头文件加载;
4、交叉编译器配置;
5、添加加宏定义;
6、项目生成动态库及可执行文件输出。

一、cmakelist 完整展示

文件结构如下:

├── 3rdparty
│   ├── opencv
│   │   ├── include
│   │   │   ├── opencv
│   │   │   └── opencv2
│   │   │   ├── lib
│   │   │   │   ├──libopencv_core.so
│   │   │   │   ├──libopencv_highgui.so
│   │   │   │   └──libopencv_imgproc.so
│   ├── rve
│   │   ├── include
│   │   ├── lib
│   │   └──libive.a
├── HeiHei
│   │   ├── include
│   │   ├──  src
│   │   │   ├──1.cpp
│   │   │   ├──2.cpp
│   │   └──main.cpp
├── workspace
├──cmakelist.txt

cmakelist.txt 全文

cmake_minimum_required(VERSION 3.5)
set(CMAKE_SKIP_BUILD_RPATH "FALSE")
set(CMAKE_C_COMPILER "/opt/linux-uclibcgnueabihf-gcc")
set(CMAKE_CXX_COMPILER "/opt/llinux-uclibcgnueabihf-g++")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE Release)
################################## 项目可选项 ############################################
set(PROJECT_NAME "HelloHeiHei")
set(OpenCV_DIR "/3rdparty/opencv") 
set(IVE_DIR  "/3rdparty/rve") 
set(SRC_DIR  "./HeiHei") 
# 输出路径
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/workspace)
set(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/workspace)

########################################################################################

project(${PROJECT_NAME})
#STEP1 头文件配置
include_directories(${OpenCV_DIR}/include)
include_directories(${OpenCV_DIR}/include/opencv)
include_directories(${OpenCV_DIR}/include/opencv2)
include_directories(${IVE_DIR}/include)
include_directories(${SRC_DIR}/include/HeiHiei)

#STEP2 宏定义配置
add_definitions(-DSIMULATE)

#STEP3 源文件配置 
set(SRC_FILE ${SRC_DIR}/src/1.cpp
			 ${SRC_DIR}/src/2.cpp
			 ${SRC_DIR}/main.cpp)

#STEP4 依赖库路径配置
link_directories(${OpenCV_DIR}/lib)
link_directories(${IVE_DIR}/lib)

#STEP5 目标生成
# 库文件中SHARED代表动态的,STATIC代表静态的
if(1)
add_executable(${PROJECT_NAME} ${SRC_FILE})
else()
add_library(${PROJECT_NAME} SHARED ${SRC_FILE})
endif()

#STEP6 依赖库链接
target_link_libraries(${PROJECT_NAME} libive.a)
target_link_libraries(${PROJECT_NAME} libopencv_core.so libopencv_highgui.so libopencv_imgproc.so)

二、内容解析

整个cmakelist分为五块:除 编译器相关配置,项目路径配置外。剩余的部分五块按顺序编写。
step1、头文件配置
include_directories(${OpenCV_DIR}/include);${OpenCV_DIR}/include为头文件所在路径
step2、 宏定义配置
add_definitions(-DSIMULATE);加入SIMULATE宏定义。
step3、源文件配置

set(SRC_FILE ${SRC_DIR}/src/1.cpp
			 ${SRC_DIR}/src/2.cpp
			 ${SRC_DIR}/main.cpp)

将多个源文件打包写入SRC_FILE
step4、依赖库路径配置
link_directories(${OpenCV_DIR}/lib);写入第三方库的路径。
step5、项目生成
add_executable(${PROJECT_NAME} ${SRC_FILE});生成可执行文件;
add_library(${PROJECT_NAME} SHARED ${SRC_FILE});生成库文件,动态静态通过SHARED 和STATIC 关键字区分
setp6、依赖库链接
target_link_libraries(${PROJECT_NAME} libive.a);项目名后面跟上需要依赖的库文件名

三、易错点总结

1、step3与step5需要分别放在step4的前后。否则会出现相关库找不到的错误。
2、若动态库存在相关依赖关系,编译过程可能告警,但不影响生成及使用。保障最终运行环境中,能找到相关库即可。
例如 libopencv_highgui.so 会在自己的上两级目录“…/…/”去找“libopencv_imgproc.so”和“libopencv_core.so”。但本工程中,三者在同一路径下,所编译过程会告警,但不影响生成和最后使用。

四、使用方法;

1、将cmakelist.txt放在HeiHei 同一级目录下,
2、新建build文件,用于存放cmake中间过程;
3、进入build,执行cmake…
4、执行make
5、在配置的输出路径获取生成的目标。

代码如下

rm -rf build
mkdir build
cd build
cmake ..
make -j8
cd ..
rm -rf build
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值