cmake CMakeLists.txt 的编写和基础使用
【摘要】
cmake CMakeLists.txt 的编写和基础使用
hello.cpp 和 CMakeLists.txt 的简洁编写
同一目录下 依次编写 hello.cpp 和 ...
cmake CMakeLists.txt 的编写和基础使用
hello.cpp 和 CMakeLists.txt 的简洁编写
同一目录下 依次编写 hello.cpp 和 CMakeLists.txt
CMakeLists.txt 是 cmake 的构建定义文件
- vim hello.cpp
#include<stdio.h>
void printHello()
{
printf("hello moli \n");
}
int main()
{
printHello();
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- vim CMakeLists.txt
# Define project name
project(hello_project)
# Declare the executable target built from your sources
add_executable(hello_exe hello.cpp)
- 1
- 2
- 3
- 4
- 5
- 6
外部构建 – 编译构建
- 依次执行以下命令即可
# 创建独立的构建目录
mkdir build
cd build
# 开始构建 -- 生成 Makefile
cmake ..
# 进行工程的实际构建 -- 生成 可执行文件 hello_exe
make
# 运行可执行程序
./hello_exe
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
如果要看到 make 构建的详细过程则执行 make VERBOSE=1 即可
make VERBOSE=1
# 输出大致如下,通常无须关注
/usr/bin/cmake -S/home/moli/project/four/cmakeTest -B/home/moli/project/four/cmakeTest/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/moli/project/four/cmakeTest/build/CMakeFiles /home/moli/project/four/cmakeTest/build/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/home/moli/project/four/cmakeTest/build'
make -f CMakeFiles/hello_exe.dir/build.make CMakeFiles/hello_exe.dir/depend
make[2]: Entering directory '/home/moli/project/four/cmakeTest/build'
cd /home/moli/project/four/cmakeTest/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/moli/project/four/cmakeTest /home/moli/project/four/cmakeTest /home/moli/project/four/cmakeTest/build /home/moli/project/four/cmakeTest/build /home/moli/project/four/cmakeTest/build/CMakeFiles/hello_exe.dir/DependInfo.cmake --color=
make[2]: Leaving directory '/home/moli/project/four/cmakeTest/build'
make -f CMakeFiles/hello_exe.dir/build.make CMakeFiles/hello_exe.dir/build
make[2]: Entering directory '/home/moli/project/four/cmakeTest/build'
make[2]: Nothing to be done for 'CMakeFiles/hello_exe.dir/build'.
make[2]: Leaving directory '/home/moli/project/four/cmakeTest/build'
[100%] Built target hello_exe
make[1]: Leaving directory '/home/moli/project/four/cmakeTest/build'
/usr/bin/cmake -E cmake_progress_start /home/moli/project/four/cmakeTest/build/CMakeFiles 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 以上命令运行效果如下:
到这里为止您已经完全掌握了 cmake 的基础使用方法
了解 CMakeLists.txt 编写规则
- 变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名
- 指令(参数 1 参数 2…) 参数使用括弧括起,参数之间使用空格或分号分开
- 指令是大小写无关的,参数和变量是大小写相关的
- 注意在编写 CMakeLists.txt 时注意形成统一的风格即可
- 清理工程 执行 make clean -
构建一个 引入 openCV 库的示例
项目目录结构如下:
sudo apt install tree
tree
.
├── build
├── CMakeLists.txt
├── eat.jpg
├── hello.cpp
└── test.cpp
1 directory, 4 files
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
项目代码如下
- hello.cpp
#include<stdio.h>
void printHello()
{
printf("hello moli \n");
}
- 1
- 2
- 3
- 4
- 5
- 6
- test.cpp
- 参考链接:Linux 个人用户 openCV编译安装
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void printHello();
int main()
{
printHello();
Mat image = imread("eat.jpg");
double scale = 0.5;
Size dsize = Size(image.cols * scale, image.rows * scale);
Mat image2 = Mat(dsize, CV_32S);
cv::resize(image, image2, dsize);
char resImg[] = "resImg.jpg";
cv::imwrite(resImg,image2);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- CMakeLists.txt
# cmake needs this line
cmake_minimum_required(VERSION 3.1)
# Define project name
project(hello_project)
# Define variable
set(SRC_LIST hello.cpp test.cpp)
# add OpenCV_DIR 需要设置为 自己编译的 OpenCV_DIR
set(OpenCV_DIR /home/moli/soft/sysOpenCV/opencv/build)
find_package(OpenCV REQUIRED)
# run make print some log infos
message(STATUS "OpenCV library status:")
message(STATUS " config: ${OpenCV_DIR}")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
# Declare the executable target built from your sources
add_executable(hello_exe ${SRC_LIST})
# Link your application with OpenCV libraries
target_link_libraries(hello_exe PRIVATE ${OpenCV_LIBS})
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
-
在本例我们使用了 ${} 来引用变量,这是 cmake 的变量应用方式,但是,有一些例外,比 如在 IF 控制语句,变量是直接使用变量名引用,而不需要 ${}
-
使用 set(SRC_LIST hello.cpp) 设置 变量;如果有多个文件需要编译,也可以定义成: SET(SRC_LIST hello.cpp moli.cpp) ,但是这多个文件中只能有一个 main 函数
-
add_executable(hello_exe ${SRC_LIST}) 定义了这个工程会生成一个文件名为 hello_exe 的可执行文件
-
… 佛系看注释吧… 都是字面意思
编译构建运行
cd build/
cmake ..
make
cp ../eat.jpg .
./hello_exe
ll
- 1
- 2
- 3
- 4
- 5
- 6
运行效果如下
静态库与动态库构建
… 有点复杂的样子,后续再梳理;
文章来源: positive.blog.csdn.net,作者:墨理学AI,版权归原作者所有,如需转载,请联系作者。
原文链接:positive.blog.csdn.net/article/details/116197704
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)