本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