cmake CMakeLists.txt 的编写和基础使用

举报
墨理学AI 发表于 2022/01/11 00:15:53 2022/01/11
【摘要】 cmake CMakeLists.txt 的编写和基础使用 hello.cpp 和 CMakeLists.txt 的简洁编写 同一目录下 依次编写 hello.cpp 和 ...

cmake CMakeLists.txt 的编写和基础使用

0-0


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
  • 以上命令运行效果如下:

1-0

到这里为止您已经完全掌握了 cmake 的基础使用方法


了解 CMakeLists.txt 编写规则


  1. 变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名
  2. 指令(参数 1 参数 2…) 参数使用括弧括起,参数之间使用空格或分号分开
  3. 指令是大小写无关的,参数和变量是大小写相关的
  4. 注意在编写 CMakeLists.txt 时注意形成统一的风格即可
  5. 清理工程 执行 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
#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
  1. 在本例我们使用了 ${} 来引用变量,这是 cmake 的变量应用方式,但是,有一些例外,比 如在 IF 控制语句,变量是直接使用变量名引用,而不需要 ${}

  2. 使用 set(SRC_LIST hello.cpp) 设置 变量;如果有多个文件需要编译,也可以定义成: SET(SRC_LIST hello.cpp moli.cpp) ,但是这多个文件中只能有一个 main 函数

  3. add_executable(hello_exe ${SRC_LIST}) 定义了这个工程会生成一个文件名为 hello_exe 的可执行文件

  4. … 佛系看注释吧… 都是字面意思

编译构建运行

cd build/
cmake ..
make
cp ../eat.jpg .
./hello_exe 
ll

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

运行效果如下

2-1


静态库与动态库构建


… 有点复杂的样子,后续再梳理;

文章来源: positive.blog.csdn.net,作者:墨理学AI,版权归原作者所有,如需转载,请联系作者。

原文链接:positive.blog.csdn.net/article/details/116197704

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。