栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

linux下g++、make、cmake编译工具代码实例

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

linux下g++、make、cmake编译工具代码实例

目录
    • 前言
    • 代码实例
      • 项目目录结构
      • g++方式
      • make方式
      • cmake方式
    • 问题
    • 总结

前言

g++:c++编译器

make:批处理工具,通过makefile文件实现批处理,本质还是g++编译器进行编译

cmake:跨平台编译工具,通过CMakeLists.txt文件实现自动编译,本质还是转成makefile实现批处理

项目源码在上上一篇文章:
https://editor.csdn.net/md/?articleId=124302251

代码实例

这个例子比较简单,主要为了说明这三个工具的使用。

项目目录结构

g++方式
# 在项目根目录下执行
g++ -std=c++11 ./src/*.cpp -o ./bin/process01 -I ./include/ -L ../bin/

缺点:源代码多时,用gcc逐个去编译,工作量大、容易混乱,且不能实现自动编译

因此,产生了make方式。

make方式

在项目src目录下,创建makefile文件,文件内容如下:

TARGET=process
LIBS=-lpthread
OBJS=ProcessInfo.o main.o
CXXFLAGS=-I ../include/
LDFLAGS=-L ../bin/
OUTPUT_DIR=../bin

$(TARGET):*.cpp
	$(CXX) -std=c++11  $^ -o $(OUTPUT_DIR)/$@ $(LIBS) $(CXXFLAGS)

	@echo "$(TARGET) build success!"

clean:
	$(RM) $(OBJS) $(TARGET)

执行:

make

结果:

缺点:不可跨平台,且当工程非常大的时候,手写makefile也非常麻烦

所以,产生了cmake方式,也是我推荐和喜欢的方式

cmake方式

在项目根目录下创建CMakeLists.txt文件,内容如下:

# 设置CMake最小版本要求
CMAKE_MINIMUM_REQUIRED(VERSION 3.21)

# 设置项目名称
PROJECT(processInfo)

# 查找项目src目录下的所有源文件,并将名称保存到 DIR_SRCS变量
aux_source_directory(${PROJECT_SOURCE_DIR}/src DIR_SRCS)

# 设置包含的头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)

# 设置文件输出路径为工程目录下的bin文件下
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

# 指定生成目标
ADD_EXECUTABLE(processInfo ${DIR_SRCS})

执行(外部构建):

# 在当前目录下创建build目录
mkdir build

​# 进入build 目录
cd build​

# 编译上级的CMakeLists.txt,生成makefile
cmake ..​

# 执行make命令,生成目标
make


结果:

[root@localhost ProcessInfo]# tree
.
├── bin
│   └── processInfo
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   │   ├── 3.21.4
│   │   │   ├── CMakeCCompiler.cmake
│   │   │   ├── CMakeCXXCompiler.cmake
│   │   │   ├── CMakeDetermineCompilerABI_C.bin
│   │   │   ├── CMakeDetermineCompilerABI_CXX.bin
│   │   │   ├── CMakeSystem.cmake
│   │   │   ├── CompilerIdC
│   │   │   │   ├── a.out
│   │   │   │   ├── CMakeCCompilerId.c
│   │   │   │   └── tmp
│   │   │   └── CompilerIdCXX
│   │   │       ├── a.out
│   │   │       ├── CMakeCXXCompilerId.cpp
│   │   │       └── tmp
│   │   ├── cmake.check_cache
│   │   ├── CMakeDirectoryInformation.cmake
│   │   ├── CMakeOutput.log
│   │   ├── CMakeTmp
│   │   ├── feature_tests.bin
│   │   ├── feature_tests.cxx
│   │   ├── Makefile2
│   │   ├── Makefile.cmake
│   │   ├── processInfo.dir
│   │   │   ├── build.make
│   │   │   ├── cmake_clean.cmake
│   │   │   ├── compiler_depend.make
│   │   │   ├── compiler_depend.ts
│   │   │   ├── DependInfo.cmake
│   │   │   ├── depend.make
│   │   │   ├── flags.make
│   │   │   ├── link.txt
│   │   │   ├── progress.make
│   │   │   └── src
│   │   │       ├── Main.cpp.o
│   │   │       ├── Main.cpp.o.d
│   │   │       ├── ProcessInfo.cpp.o
│   │   │       └── ProcessInfo.cpp.o.d
│   │   ├── progress.marks
│   │   └── TargetDirectories.txt
│   ├── cmake_install.cmake
│   └── Makefile
├── CMakeLists.txt
├── include
│   └── ProcessInfo.h
├── makefile
└── src
    ├── Main.cpp
    └── ProcessInfo.cpp

13 directories, 40 files
问题

在使用cmake时,根据错误提示,找对应问题,如下例子:

根据提示,去对应行找出出错问题,如果一眼看不出来问题,可以尝试注释掉对应行内容,看是否还报错,从而确定是否是对应行错误,然后,具体排查报错原因,一般是语法错误或空格导致。

总结

在实际的项目中,推荐使用cmake方式进行项目构建,简单、跨平台。并且,采用cmake的外部构建方式,这样产生的构建文件不会污染项目结构。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/826086.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号