编译与链接

makefile

隐藏的细节:编译与链接

vi main.c
vi math.c
gcc -c main.c
gcc -c math.c
编译之后出现两个扩展名为.o的文件,目标文件
ls *.o
main.o math.o

readelf -h main.o 在文件头部找到可执行文件的基本信息和支持的操作系统,机器类型等信息
readelf -S main.o 显示区块
objdump -s -d main.o 查看机器代码和反汇编
objdump -r main.o 显示重定位表

编译后不能直接执行,需要连接
连接:将编译的静态文件和静态库,运行时库组合拼装成一个可执行文件
gcc main.o math.o -o main
./main

定义依赖树

all:main

main: main.o math.o
		gcc main.o  math.o main
		
main.o:main.c
		gcc -c main.c
		
main.o:math.c
		gcc -c math.c	
        
clean: 
		rm main main.o math.o
make main
//则自动执行以下
gcc -c main.c
gcc -c math.c	
gcc main.o  math.o main

tree 显示已经生成依赖结构
修改main.c
make main
//不需要执行gcc -c math.c	
gcc -c main.c 
gcc main.o  math.o main

CMake

cmake入门

windows下载cmake 
choco install cmake
winget install cmake

配置安装目录到环境变量

创建CMakeLists.txt
单文件基础代码
cmake_minimum_required(VERSION 3.10)

project(Example)

add_executable(Example main.cpp)
命令行:
cmake -S . -B build 配置项目(配置版本)(vscode中菜单>cmake configure)
cmake --build build 构建项目(vscode中菜单>cmake build)

多文件
cmake_minimum_required(VERSION 3.10)

project(Example)

find_package(库 REQUIRED)
find_package(库 REQUIRED)
find_package(库 REQUIRED)

file(GLOB SRC_FILES
"${PROJECT_SOURCE_DIR}/src/*.h"
"${PROJECT_SOURCE_DIR}/src/*.cpp"
"${PROJECT_SOURCE_DIR}/src/*.c"
"${PROJECT_SOURCE_DIR}/src/*.cc")

add_executable(${CMAKE_PROJECT_NAME} ${SRC_FILES})构建可执行文件 工程名字 匹配的所有源文件

target_compile_features(${CMAKE_PROJECT_NAME} PRIVATE cxx_std_17)开启C++17支持(如果需要)

add_custom_command(
TARGET ${CMAKE_PROJECT_NAME}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
	"${PROJECT_SOURCE_DIR}/assets"
	"$<TARGET_FILE_DIR:${CMAKE_PROJECT_NAME}>/assets>")
将根目录下的assets文件夹拷贝到输出路径下

C++第三方库可以使用vcpkg安装