【Linux 基础】常见 gcc 参数与CMakeLists.txt 典型代码的比较

预备知识:gcc/g++ 的使用办法和常见参数

普通的C程序如果要成为可执行的程序,需要经过四个步骤

1. 预处理

2.汇编

3.编译

4.链接

使用方法一: 命令行使用gcc产生可执行文件

gcc 先执行1-2-3 命令,再执行4命令:

gcc *.c(多个.c文件) -o target.o
gcc *.o(多个.o文件) -o test

例子:gcc test.c -o test.o

    gcc test.o  -o test

或者使用gcc直接完成1-2-3-4步骤:gcc *.c -o test

使用方法二: 命令行使用gcc进行语法检查

gcc *.c

输入此命令后如果有语法错误,则会给出相应的提示

 

常见的gcc/g++编译参数:

 

0. 典型CMake 代码(包含静态库)

cmake_minimum_required(VERSION 3.0)
project(CALC)

##一、源文件部分:
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp    # 搜索指定目录下源文件
#也可以用:
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST)

##二、头文件&库文件部分
include_directories(${PROJECT_SOURCE_DIR}/include)# 包含头文件路径,相当于 gcc -I
link_directories(${PROJECT_SOURCE_DIR}/lib)# 包含静态库路径, 相当于 gcc -L
link_libraries(calc) # 链接静态库, 相当于 gcc -l

add_executable(app ${SRC_LIST})#生成可执行文件,相当于 gcc .... -o ...
#链接库也可以用 target_link_libraries()

 

1. set() ——实现私人定制

1. 定义变量:

# 方式1: 各个源文件之间使用空格间隔
# set(SRC_LIST add.c  div.c   main.c  mult.c  sub.c)

# 方式2: 各个源文件之间使用分号 ; 间隔
set(SRC_LIST add.c;div.c;main.c;mult.c;sub.c)
add_executable(app  ${SRC_LIST})

2.  指定使用的C++标准

#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)
#增加-std=c++14
set(CMAKE_CXX_STANDARD 14)
#增加-std=c++17
set(CMAKE_CXX_STANDARD 17)

其功能相当于:

$ g++ *.cpp -std=c++11 -o app

或者

#增加-std=c++11
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=11
#增加-std=c++14
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=14
#增加-std=c++17
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=17

3.  指定输出的路径

在CMake中指定可执行程序输出的路径,也对应一个宏,叫做EXECUTABLE_OUTPUT_PATH,它的值还是通过set命令进行设置

set(HOME /home/robin/Linux/Sort)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)

如果这个路径中的子目录不存在,会自动生成,无需自己手动创建。

 

2. aux_source_directory() 和 file()——自动搜索源文件

如果一个项目里边的源文件很多,在编写CMakeLists.txt文件的时候不可能将项目目录的各个文件一一罗列出来,这样太麻烦也不现实。所以,在CMake中为我们提供了搜索文件的命令,可以使用aux_source_directory命令或者file命令。

方式1:

aux_source_directory(< dir > < variable >)

  • dir:要搜索的目录
  • variable:将从dir目录下搜索到的源文件列表存储到该变量中
cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${PROJECT_SOURCE_DIR}/include)
# 搜索 src 目录下的源文件
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST)
add_executable(app  ${SRC_LIST})

方式2:

file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)

#egs
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
file(GLOB MAIN_HEAD ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)

#CMAKE_CURRENT_SOURCE_DIR 宏表示当前访问的 CMakeLists.txt 文件所在的路径。
#关于要搜索的文件路径和类型可加双引号,也可不加:
file(GLOB MAIN_HEAD "${CMAKE_CURRENT_SOURCE_DIR}/src/*.h")

 

X. 笔者使用CMake时遇到的错误

X-1 CMake 交叉编译无效问题解决

一般而言,可以使用一个 .cmake 文件指定交叉编译工具链,然后在执行 cmake 命令的时候,使用带宏定义的方式:

 cmake -DCMAKE_TOOLCHAIN_FILE=<.cmake 文件名>

笔者为了方便,在顶层 CMakefile.txt 中写上了 set(CMAKE_TOOLCHAIN_FILE  ./myarm.cmake),意思是声明了CMAKE_TOOLCHAIN_FILE这个宏,并定义为./myarm.cmake

cmake_minimum_required(VERSION 3.15.0)
project(PhotoCollect)

set(CMAKE_TOOLCHAIN_FILE  ./myarm.cmake)#定义“设置交叉编译链的文件”的宏
#。。。下面省略

但是发现这个不起作用。

后来发现问题所在:配置ARM 交叉编译的这些代码需要放置在project()命令之前,否则不会生效!改成这样就可以了:

set(CMAKE_TOOLCHAIN_FILE  ./myarm.cmake)#定义“设置交叉编译链的文件”的宏,放在 project()之前!!!

cmake_minimum_required(VERSION 3.15.0)
project(PhotoCollect)
#。。。下面省略

 

posted @ 2023-08-29 15:22  FBshark  阅读(65)  评论(0编辑  收藏  举报