c/c++语言项目的组织
安装c/c++编译器:
sudo apk add build-base # for alpinelinux
sudo yum -y install gcc gcc-c++ # for centos
最简单的c/c++组织方法
- 最简单的做法:一个
main()
函数写到底。 - 理性一点:把一些模块写成函数放到
main()
外面。
以汽车car举例:
/* file name: main.c */
#include <stdio.h>
void run(char *name){
printf("%s is running\n", name);
}
int main(){
run("Rolls-Royce");
}
gcc -o main main.c
./main # Rolls-Royce is running...
优点:快,简单。
缺点:项目大一点就麻烦了。
c/c++头文件拆分法
高级的模块化:接口(函数,类)与实现(源文件)分离。
目录结构:
./
|- car.h
|- car.c
|- main.c
- 接口,定义在头文件里:
/* file name: car.h */
void run(char *name);
- 实现,定义在源文件里:
/* file name: car.c */
#include <stdio.h>
#include "car.h"
void run(char *name){
printf("%s is running...\n", name);
}
- 使用:
/* file name: main.c */
#include "car.h"
int main(){
run("Rolls-Royce");
}
gcc -o main car.c main.c
./main # Rolls-Royce is running...
用cmake组织
当写的文件有点多的时候,模块化的优势就很明显。我们需要更高效的源码组织方式。
alpinelinux安装cmake:
$sudo apk add cmake # 安装cmake和make。
- 极简版
目录结构:
./
|- car.h
|- car.c
|- main.c
|- CMakeLists.txt
|- build/
编写CMakeLists.txt
cmake_minimum_required(VERSION 3.0.0)
project(ProjectNameHere)
add_executable(main main.c car.c)
使用方法:
cd build # goto build directory
cmake .. # 使用上层的CMakeLists.txt 生成 makefile
make # 编译
./main # 运行
- 复杂一点的结构,带有子项目(放在src/):
目录结构:
./
|- main.cpp
|- CMakeLists.txt
|- src/
| |- CMakeLists.txt
| |- car.cpp
| |- car.h
|- build/
我们发现有两个CMakeLists.txt:
- 里面那个CMakeLists.txt负责本文件夹的子项目:
aux_source_directory(. SRC_LIST)
add_library(awesome_lib_name ${SRC_LIST})
注解:aux_source_directory(dir VAR)
查找一个目录下所有的源代码文件并将列表存储在一个变量中.
- 最外层的那个CMakeLists.txt负责整个项目。
内容如下:
cmake_minimum_required(VERSION 3.0.0)
project(peojectNameHere)
aux_source_directory(. ROOT_DIR)
add_subdirectory(src)
add_executable(main ${ROOT_DIR})
target_link_libraries(main awesome_lib_name)
使用方法:
cd build # goto build directory
cmake .. # 使用上层的CMakeLists.txt 生成 makefile
make # 编译
./main # 运行
总结
-
cmake与make是怎样工作的,为什么要用cmake?
make是以makfile为基础的项目构建工具,只是Makefile的可移植性较差,跨平台意味着要重新编写。
-
如何学习cmake?
cmake复杂的很:见CMake 如何入门? - 0xCCCCCCCC的回答 - 知乎 我的要求不高, 能用就行。