多文件编译与链接

单文件和多文件编译

单文件编译

缺点

  1. 所有的代码都堆在一起,不利于模块化和理解。
  2. 工程变大时,编译时间变得很长,改动一个地方就得全部重新编译。

多文件编译

优点

  1. 文件模块化,各文件之间通过符号声明相互引用。
  2. 当一个文件改动时,只需要重新编译该文件,再将编译后的该文件与之前的编译后的文件全部链接起来。
#-c用于生成临时的未链接的对象文件.o,之后一系列对象文件链接起来得到最终的可执行文件.out。
g++ -c main.c -o main.o
g++ -c hello.c -o hello.o
g++ main.o hello.o -o a.out

Makefile

优点:

  1. 只需写出文件间的依赖关系和生成各文件的规则,不需要对每个.cpp或.o都调用g++编译链接。
  2. 只会重新编译改动过的文件。
  3. 能够并行地发起编译(make -j)。

缺点:

  1. 需要写出每个文件间的依赖关系,有头文件时比较麻烦。
  2. 在Unix上是通用的,windows上则不然。
  3. 语法简单,无法做一些复杂的判断。
  4. 不同的编译器有不同的flag规则,对g++ 准备的参数(-c)可能对MSVC不适用。

CMake

  1. 可以自动检测源文件和头文件之间的依赖关系,导出到Makefile里。
  2. 能够在调用时生成当前系统所支持的构建系统。
  3. 具有相对高级的语法,内置的函数能够处理configure,install等常见需求。
  4. 可以自动检测当前的编译器,使用库的方式添加flag。
# cmake 最低版本需求
cmake_minimum_required(VERSION 3.12)
# 工程名称
project(hellocmake LANGUAGES CXX)
# 设置
set(CMAKE_CXX_STANDARD 11)
# 生成静态库libtest.a
add_library(libtest STATIC main.cpp hello.cpp)
# 生成动态库libtest.so
add_library(libtest SHARED main.cpp hello.cpp)
# 编译源码生成目标
add_executable(a.out main.cpp hello.cpp)
# 链接制作的库
target_link_libraries(a.out PUBLIC libtest)
添
#读取当前目录的CMakeLists.txt,并在build文件夹下生成Makefile。
cmake -B build 
#读取build/Makefile,并生成a.out。
make -C build
posted @ 2022-05-18 00:15  煮茶听风雨  阅读(93)  评论(0编辑  收藏  举报