Author:Peter
    
    
    
     Location:FZU
    
    
    
     Date: 2022-3-21
    
   
    
     :授人以鱼不如授人以渔。
    
   
了解C/C++底层编译原理后,利用Cmake工具构建自己的工程,便于跨平台开发。
     文章目录
    
    
    
    一、gcc/g++使用
   
    
    
    1.gcc/g++ 常用编译参数
   
| 参数 | 功能 | 
|---|---|
| -g | 编译带调试信息的可执行文件(可用于GDB断点调试) | 
| -O[n] n∈[0,3],一般为-O2 | 编译器优化源代码,提升代码运行效率 | 
| – I | 指定头文件位置 | 
| – L | 指定链接库位置 | 
| – l | 指定链接名,如调用libsrt.so,则-lsrt | 
| -Wall | 打印warning信息 | 
| -w | 关闭warning信息 | 
| -std=c++11 | 设置编译标准为c11 | 
| -c | 只编译不链接,生成同名.o文件 | 
| -o | 指定输出文件名 | 
| – D | 定义宏,如-D Debug=1,则源程序中相应Debug宏开关置1 | 
    
    
    2. 工程目录结构
   
.
├── include
│   ├── sort.h
│   └── swap.h
├── main.cpp
└── src
    ├── sort.cpp
    └── swap.cpp
2 directories, 5 files
/*-----------swap.h--------------*/
#pragma once
#ifndef __SWAP_H__
#define __SWAP_H__
#include <iostream>
void mySwap(int &a, int &b);
#endif
/*-----------swap.cpp--------------*/
#include "swap.h"
void mySwap(int &a,int&b)
{
#ifdef Debug
    std::cout<<"Debug"<<std::endl;
#endif
    int temp = a;
    a = b;
    b = temp;
}
/*-----------sort.h--------------*/
#pragma once
#ifndef __SORT_H__
#define __SORT_H__
#include <iostream>
#include <set>
template <class T>
class myCompare
{
public:
    inline bool operator()(const T &a, const T &b) const
    {
        return a > b;
    }
};
// 冒泡排序从大到小
void mySortSet(int arr[], int arrSize);
// 模板函数需要定义在.h中,不能与声明分开为两个模块
template <class T>
void myTmpSortSet(T arr[], int arrSize)
{
    std::set<T, myCompare<T>> setNumLargeToSmall;
    for (int i = 0; i < arrSize; ++i)
    {
        setNumLargeToSmall.insert(arr[i]);
    }
    int j = 0;
    for (auto iter = setNumLargeToSmall.begin(); iter != setNumLargeToSmall.end(); ++iter)
    {
        arr[j] = *iter;
        ++j;
    }
}
#endif
/*-----------sort.cpp--------------*/
#include "sort.h"
void mySortSet(int arr[], int arrSize)
{
    bool b_swap = true; // 标志位,记录每次排序是否有元素位置交换
    int count = arrSize - 1;
    for (int i = 0; i < count && b_swap; ++i) // 如果上次排序元素位置未改变,则排序完成。
    {
        b_swap = false; // 每次排序前,标志位复位
        for (int j = 0; j < count - i; ++j)
        {
            if (arr[j] < arr[j + 1])  //若要从小到大,则arr[j]>arr[j+1],把小的放在最前头
            {
                b_swap = true; //发生位置交换,标志位置位
                int tmp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}
/*-----------main.cpp--------------*/
#include "swap.h"
#include "sort.h"
#include <algorithm>
#include <functional>
template <class T>
void printArray(T arr[], const int &arrSize)
{
    for (int i = 0; i < arrSize; ++i)
        std::cout << arr[i] << " ";
}
void countNum(int arr[], const int &arrSize, const int &n)
{
    //统计不大于等于n的数,即小于n的数
    std::cout << std::count_if(arr, arr + arrSize, std::not1(std::bind2nd(std::greater_equal<int>(), n))) << "\n";
    // bind std::placeholders::_1(占位符,占1位,_2占两位) <==> a  n<==> b
    // 统计比n大的数
    std::cout << std::count_if(arr, arr + arrSize, std::bind(myCompare<int>(), std::placeholders::_1, n)) << "\n";
    // lambda 统计大于-n小于n的数,注意[&]捕捉外部参数变量n,以引用方式传递,[=]值传递
    std::cout << std::count_if(arr, arr + arrSize, [&](int x){ return x > -n && x < n; })
              << "\n";
}
int main(int argc, char **argv)
{
    int a = 10, b = 15;
    mySwap(a, b);
    std::cout << a << "\t" << b << std::endl;
    int arr1[] = {1, 3, 2, 5, 4};
    int arr1_size = sizeof(arr1) / sizeof(int);
    double arr2[] = {10.289, 31.34, 3.22, 7.05, 4, 9.8};
    int arr2_size = sizeof(arr2) / sizeof(double);
    mySortSet(arr1, arr1_size);
    myTmpSortSet(arr2, arr2_size);
    std::cout << "arr1: ";
    printArray(arr1, arr1_size);
    std::cout << "\n"
              << "arr2: ";
    printArray(arr2, arr2_size);
    std::cout << "\n";
    countNum(arr1, arr1_size, 4);
    return 0;
}
    
    
    3. 直接编译
   
#其实是由汇编main.o swap.o,sort.o文件生成二进制可执行文件test
g++ -O2 -std=c++11 main.cpp src/swap.cpp src/sort.cpp -D Debug -I include/ -o test
#运行二进制文件test
./test
Debug
15      10
arr1: 5 4 3 2 1 
arr2: 31.34 10.289 9.8 7.05 4 3.22
3
1
3
    
    
    4. 生成库文件编译
   
    
    
    4.1 静态编译(生成的可执行文件大,可直接使用)
   
#进入src目录
cd src
#汇编、将swap.cpp编译成swap.o  ../返回上级目录,由于Debug宏在swap.cpp中,固需在此-D Debug=1
g++ swap.cpp -D Debug=1 -c -I ../include
g++ sort.cpp -c -I ../include
#生成静态链接库libswap.a
ar rs libswso.a swap.o sort.o
#回到上级目录
cd ..
#链接,生成可执行文件test
g++ main.cpp -O2 -I include/ -L src/ -lswso -o test
#编译后
.
├── include
│   ├── sort.h
│   └── swap.h
├── main.cpp
├── src
│   ├── libswso.a
│   ├── sort.cpp
│   ├── sort.o
│   ├── swap.cpp
│   └── swap.o
└── test
2 directories, 9 files
#运行./test
Debug
15      10
arr1: 5 4 3 2 1 
arr2: 31.34 10.289 9.8 7.05 4 3.22
3
1
3
    
    
    4.2 动态编译(编译生成的可执行文件小,执行时需将调用的动态链接库放置到/usr/lib下,或利用LD_LIBRARY_PATH指定动态链接库位置)
   
    
     动态编译生成的二进制可执行文件可采用
     
      readelf fileName -a |grep .so
     
     指令或者
     
      ldd
     
     来查看绑定的动态链接库
    
    。
    
    [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
    
    0x0000000000000001 (NEEDED) 共享库:[libswso_1.0.0.so]
    
    0x0000000000000001 (NEEDED) 共享库:[libstdc++.so.6]
    
    0x0000000000000001 (NEEDED) 共享库:[libgcc_s.so.1]
    
    0x0000000000000001 (NEEDED) 共享库:[libc.so.6]
   
- 
     
 详细流程
 
#进入src目录
cd src
#生成动态链接库libswap.so
g++ swap.cpp -D Debug=1 sort.cpp -I ../include -fPIC -shared -o libswso.so
#上面命令等于如下两条
#g++ swap.cpp -D Debug=1 sort.cpp -I ../include -c -fPIC
#g++ -shared -o libswso.so swap.o sort.o
#返回上级目录
cd ..
# 链接,生成可执行文件test
g++ main.cpp -O2 -I include/ -L src/ -lswso -o test
#编译后
.
├── include
│   ├── sort.h
│   └── swap.h
├── main.cpp
├── src
│   ├── libswso.a
│   ├── libswso.so
│   ├── sort.cpp
│   └── swap.cpp
└── test
2 directories, 8 files
#运行./test
报错error
./test: error while loading shared libraries: libswap.so: cannot open shared object file: No such file or directory
#解决方案
①将libswap.so拷贝至/usr/lib
#利用LD_LIBRARY_PATH指定libswap.so位置后再执行test文件
②export LD_LIBRARY_PATH=src ./test
#运行结果
Debug
15      10
arr1: 5 4 3 2 1 
arr2: 31.34 10.289 9.8 7.05 4 3.22
3
1
3
    
    
    二、CMake使用
   
    
    
    1、CMake基本语法
   
- 基本语法格式:指令(参数1 参数2 …)各参数用分号或者空格隔开
- 
     指令大小写无关,参数和变量大小写相关
add_executable(test main.cpp swap.cpp sort.cpp) 等价于 ADD_EXECUTABLE(test main.cpp swap.cpp sort.cpp)
    
    
    2、CMake重要指令
   
- 
     
 cmake_minimum_required
 
 指定CMake最小版本要求cmake_minimum_required(VERSION 2.8.3)
- 
     
 project
 
 定义工程名称,并可指定工程支持的语言//语法:project(projectName[CXX][C][JAVA]) project(HELLO_FZU)
- 
     
 set
 
 显示定义变量//语法:set(VAR [VALUE][CACHE TYPE DOCSTRING[FORCE]]) set(SRC swap.cpp sort.cpp) //定义SRC变量,值为swap.cpp sort.cpp
- 
     
 include_directories
 
 向工程添加多个头文件搜索路径//语法:include_directories([AFTER][BEFORE][SYSTEM]dir1 dir2 ...) include_directories(/usr/include/fzuHeader /swap/include)//添加了两个include文件夹
- 
     
 link_directories
 
 向工程添加多个链接库文件搜索路径//语法:include_directories(dir1 dir2 ...) link_directories(/usr/lib/fzuLib /swap/lib)//添加了两个lib文件夹
- 
     
 add_library
 
 生成库文件//语法:add_library(libname [SHARED|STATIC|MODULE]source1 source2 ... sourceN) add_library(swso SHARED ${SRC})//利用SRC变量生成动态链接库libswap.so add_library(swso STATIC ${SRC})//利用SRC变量生成静态链接库libswap.a
- 
     
 add_compile_options
 
 添加编译参数//语法:add_compile_options(<option> ...) add_compile_options(-Wall -std=c++11 -O2 -D DNAME )//以C11标准编译,开启warning警告,编译器优化,定义DNAME宏
- 
     
 add_definitions
 
 添加编译参数add_definitions("-D HEAVY_DEBUG")
- 
     
 add_executable
 
 生成可执行文件//语法:add_executable(main main.cpp) add_executable(main main.cpp)//编译main.cpp生成二进制可执行文件main
- 
     
 target_link_libraries
 
 为target添加需要链接的共享库等同于g++ -l//语法:target_link_libraries(target library1<debug | optimized> library2) target_link_libraries(main swso)//把生成的libswap.so链接到可执行程序main
- 
     
 add_subdirectory
 
 ( 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置//语法:add_subdirectory(source_dir [binary_dir][EXCLUDE_FROM_ALL]) add_subdirectory(src)//添加sc子目录,src中有一个CMakeLists.txt
- 
     
 aux_source_directory
 
 发现一个目录下所有的源代码文件并将列表存储到一个变量中,这个指令临时被用来自动构建源文件列表//语法:add_source_directory(dir VARIABLE) add_source_directory(. SRC)//定义SRC变量,其值为当前目录下所有的源代码文件 add_executable(main ${SRC})//编译SRC变量所代表的源代码文件,生成二进制可执行文件main
    
    
    3、CMake常用变量
   
- 
 CMAKE_C_FLAGS
 
 gcc编译选项
- 
 CMAKE_CXX_FLAGS
 
 g++编译选项//在CMAKE_CXX_FLAGS编译选项后追加-std=C++11 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=C++11")
- 
 CMAKE_BUILD_TYPE
 
 编译类型(Debug,Release)//调试时需要选择Debug set(CMAKE_BUILD_TYPE Debug) //发布时需要选择Release set(CMAKE_BUILD_TYPE Release)
- 
 CMAKE_C_FLAGS_DEBUG
 
 CMAKE_BUILD_TYPE为Debug模式时调用
- 
 CMAKE_CXX_FLAGS_DEBUG
 
- 
 CMAKE_C_FLAGS_RELEASE
 
 CMAKE_BUILD_TYPE为Debug模式时调用
- 
 CMAKE_CXX_FLAGS_RELEASE
 
- 
 CMAKE_BINARY_DIR
 
 
 
 PROJECT_BINARY_DIR
 
 
 <projectname>
 
 _BINARY_DIR
 
 
 三者变量指代的内容一致。
 
 如果是in source build,指的就是工程顶层目录
 
 如果是out of source,指的是工程编译发生的目录
 
 
 运行cmake命令的目录,即工程编译发生的路径
 
- 
 CMAKE_SOURCE_DIR
 
 
 
 PROJECT_SOURCE_DIR
 
 
 <projectname>
 
 _SOURCE_DIR
 
 
 三者变量指代的内容一致,无论采用何种编译方式,都是工程顶层目录。
 
 也就是在in source build时,他跟CMAKE_BINARY_DIR变量一致
 
 
 包含PROJECT()命令的最近一个CMakeLists.txt文件所在的文件夹路径。
 
- 
 CMAKE_C_COMPILER
 
 指定gcc编译器
- 
 CMAKE_CXX_COMPILER
 
 指定g++编译器
- 
 EXECUTABLE_OUTPUT_PATH
 
 可执行文件输出的存放路径
- 
 LIBRARY_OUTPUT_PATH
 
 链接库文件输出的存放路径
    
    
    4、利用CMake编译工程
   
CMake目录结构:项目主目录(顶层目录)存在CMakeLists.txt文件
两种方式设置编译规则:
- 包含源文件的子文件夹包含CMakeLists.txt文件,主目录的CMakeLists.txt通过add_subdirectoriy添加子目录即可。
- 包含源文件的子文件夹未包含CMakeLists.txt文件,子目录编译规则体现在主目录的CMakeLists.txt中,
如SRT工程
。
    
    
    4.1 CMake编译流程
   
- 手动编写CMakeLists.txt
- 
     执行命令cmake PATH 生成MakeFile(
 
 PATH是顶层CMakeLists.txt所在目录
 
 )
- 执行命令make进行编译
#文件位置
.     #当前目录
./    #当前目录
..    #上级目录
../   #上级目录
    
    
    4.2 两种构建方式
   
    
     1. 内部构建(in-source build)
    
    :不推荐使用
   
内部构建会在同级目录下产生一大堆中间文件,如.o文件,这些中间文件并不是我们最终所需要的,和工程源文件放在一起会显得杂乱无章。
#内部构建:
# 在当前目录下,编译本目录的CMakeLists.txt,生成Makefile和其他文件
cmake .
# 执行make命令,生成target
make
    
     2. 外部构建(out-of-source build)
    
    :推荐使用
   
将编译生成的中间文件放置指定目录,与源文件分割开。以下例子是进入build文件夹编译,则中间件都存在build目录下。
#外部构建:
# 在当前目录下,创建build文件夹,目的将生成的中间文件存到build目录
mkdir build
# 进入build文件夹
cd build
# 编译上级目录的CMakeLists.txt,生成Makefile和其他文件
cmake ..
# 执行make命令,生成target
make
    
    
    4.3 多目录CMake工程编写CMakeLists.txt(外部构建法)
   
    
    
    4.3.1 只有顶层目录拥有一个CMakeLists.txt情况
   
- 
     
 工程目录
 
#工程目录
.
├── build
├── CMakeLists.txt
├── include
│   ├── sort.h
│   └── swap.h
├── main.cpp
└── src
    ├── sort.cpp
    └── swap.cpp
3 directories, 6 files
- 
     
 CMakeLists.txt内容
 
 (
 
 此文本作用与g++直接编译效果相同
 
 )
#指定CMAKE最低版本号
cmake_minimum_required(VERSION 3.10.2)
#工程名为SWSO
project(SWSO)
#设置编译模式Debug/Release
set(CMAKE_BUILD_TYPE Debug)
#配置DEBUG模式 编译参数
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -O0 -Wall -g  -D Debug")
#配置RELEASE模式 编译参数
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O2 -Wall")
#配置可执行文件输出存放路径
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin)
#配置生成链接库输出存放路径
set(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/lib)
#指定额外头文件路径,相对路径
include_directories(${CMAKE_SOURCE_DIR}/include)
#添加编译参数
add_compile_options(-std=c++11)
#添加源文件到变量SRC
aux_source_directory(${CMAKE_SOURCE_DIR}/src/. SRC)
#生成链接库文件
add_library(swso SHARED ${SRC})
add_library(static_swso STATIC ${SRC})
#配置生成链接库版本号
set_target_properties(swso PROPERTIES OUTPUT_NAME "swso_1.0.0")
set_target_properties(static_swso PROPERTIES OUTPUT_NAME "static_swso_1.0.0")
#生成二进制可执行文件SWSO
add_executable(SWSO main.cpp)
#把生成的动态链接库libswso.so链接到可执行程序
target_link_libraries(SWSO swso)
- 
     
 详细运行流程
 
# 进入build文件夹
cd build
# 编译上级目录的CMakeLists.txt,生成Makefile和其他文件
cmake ..
#运行效果如下:
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/peter/VS_CODE_PRO/RTSP_SERVER/build
# 执行make命令,生成target
make
#运行效果如下:
Scanning dependencies of target swso
[ 12%] Building CXX object CMakeFiles/swso.dir/src/sort.cpp.o
[ 25%] Building CXX object CMakeFiles/swso.dir/src/swap.cpp.o
[ 37%] Linking CXX shared library ../lib/libswso_1.0.0.so
[ 37%] Built target swso
Scanning dependencies of target SWSO
[ 50%] Building CXX object CMakeFiles/SWSO.dir/main.cpp.o
[ 62%] Linking CXX executable ../bin/SWSO
[ 62%] Built target SWSO
Scanning dependencies of target static_swso
[ 75%] Building CXX object CMakeFiles/static_swso.dir/src/sort.cpp.o
[ 87%] Building CXX object CMakeFiles/static_swso.dir/src/swap.cpp.o
[100%] Linking CXX static library ../lib/libstatic_swso_1.0.0.a
[100%] Built target static_swso
#编译完后的目录
.
├── bin
│   └── SWSO
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   │   ├── 3.10.2
│   │   │   ├── 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.c
│   │   ├── feature_tests.cxx
│   │   ├── Makefile2
│   │   ├── Makefile.cmake
│   │   ├── progress.marks
│   │   ├── static_swso.dir
│   │   │   ├── build.make
│   │   │   ├── cmake_clean.cmake
│   │   │   ├── cmake_clean_target.cmake
│   │   │   ├── CXX.includecache
│   │   │   ├── DependInfo.cmake
│   │   │   ├── depend.internal
│   │   │   ├── depend.make
│   │   │   ├── flags.make
│   │   │   ├── link.txt
│   │   │   ├── progress.make
│   │   │   └── src
│   │   │       ├── sort.cpp.o
│   │   │       └── swap.cpp.o
│   │   ├── swso.dir
│   │   │   ├── build.make
│   │   │   ├── cmake_clean.cmake
│   │   │   ├── CXX.includecache
│   │   │   ├── DependInfo.cmake
│   │   │   ├── depend.internal
│   │   │   ├── depend.make
│   │   │   ├── flags.make
│   │   │   ├── link.txt
│   │   │   ├── progress.make
│   │   │   └── src
│   │   │       ├── sort.cpp.o
│   │   │       └── swap.cpp.o
│   │   ├── SWSO.dir
│   │   │   ├── build.make
│   │   │   ├── cmake_clean.cmake
│   │   │   ├── CXX.includecache
│   │   │   ├── DependInfo.cmake
│   │   │   ├── depend.internal
│   │   │   ├── depend.make
│   │   │   ├── flags.make
│   │   │   ├── link.txt
│   │   │   ├── main.cpp.o
│   │   │   └── progress.make
│   │   └── TargetDirectories.txt
│   ├── cmake_install.cmake
│   └── Makefile
├── CMakeLists.txt
├── include
│   ├── sort.h
│   └── swap.h
├── lib
│   ├── libstatic_swso_1.0.0.a
│   └── libswso_1.0.0.so
├── main.cpp
└── src
    ├── sort.cpp
    └── swap.cpp
17 directories, 64 files
#运行编译生成的二进制可执行文件./bin/SWSO
Debug
15      10
arr1: 5 4 3 2 1 
arr2: 31.34 10.289 9.8 7.05 4 3.22
3
1
3
    
    
    4.3.2 子目录中也含有CMakeLists.txt情况
   
- 
     
 工程目录
 
#工程目录
.
├── build
├── CMakeLists.txt
├── include
│   ├── sort.h
│   └── swap.h
├── main.cpp
└── src
    ├── CMakeLists.txt
    ├── sort.cpp
    └── swap.cpp
2 directories, 7 files
- 
     
 子目录下CMakeLists.txt内容
 
#指定CMAKE最低版本号
cmake_minimum_required(VERSION 3.10.2)
#工程名为SWSO
project(SWSO)
#设置编译模式Debug/Release
set(CMAKE_BUILD_TYPE Debug)
#配置DEBUG模式 编译参数
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -O0 -Wall -g")
#配置RELEASE模式 编译参数
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O2 -Wall")
#配置生成链接库输出存放路径
set(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/lib)
#指定额外头文件路径,相对路径
include_directories(${CMAKE_SOURCE_DIR}/include)
#添加编译参数
add_compile_options(-std=c++11)
#设置swap.cpp中的宏开关Debug
add_definitions(-D Debug)
#添加源文件到变量SRC
aux_source_directory(${CMAKE_SOURCE_DIR}/src/. SRC)
#生成链接库文件
add_library(swso SHARED ${SRC})
add_library(static_swso STATIC ${SRC})
#配置生成链接库版本号
set_target_properties(swso PROPERTIES OUTPUT_NAME "swso_1.0.0")
set_target_properties(static_swso PROPERTIES OUTPUT_NAME "static_swso_1.0.0")
- 
     
 顶层CMakeLists.txt内容
 
#指定CMAKE最低版本号
cmake_minimum_required(VERSION 3.10.2)
#工程名为SWSO
project(SWSO)
#设置编译模式Debug/Release
set(CMAKE_BUILD_TYPE Debug)
#配置DEBUG模式 编译参数
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -O0 -Wall -g")
#配置RELEASE模式 编译参数
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O2 -Wall")
#配置可执行文件输出存放路径
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin)
#指定额外头文件路径,相对路径
include_directories(${CMAKE_SOURCE_DIR}/include)
#添加编译参数
add_compile_options(-std=c++11)
#添加子目录CMakeLists.txt
add_subdirectory(${CMAKE_SOURCE_DIR}/src)
#生成二进制可执行文件SWSO
add_executable(SWSO main.cpp)
#把生成的动态链接库libswso.so链接到可执行程序
target_link_libraries(SWSO swso)
- 
     
 详细运行流程
 
# 进入build文件夹
cd build
# 编译上级目录的CMakeLists.txt,生成Makefile和其他文件
cmake ..
#运行效果如下:
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/peter/VS_CODE_PRO/TEST/build
# 执行make命令,生成target
make
#运行效果如下:
Scanning dependencies of target swso
[ 12%] Building CXX object src/CMakeFiles/swso.dir/sort.cpp.o
[ 25%] Building CXX object src/CMakeFiles/swso.dir/swap.cpp.o
[ 37%] Linking CXX shared library ../../lib/libswso_1.0.0.so
[ 37%] Built target swso
Scanning dependencies of target SWSO
[ 50%] Building CXX object CMakeFiles/SWSO.dir/main.cpp.o
[ 62%] Linking CXX executable ../bin/SWSO
[ 62%] Built target SWSO
Scanning dependencies of target static_swso
[ 75%] Building CXX object src/CMakeFiles/static_swso.dir/sort.cpp.o
[ 87%] Building CXX object src/CMakeFiles/static_swso.dir/swap.cpp.o
[100%] Linking CXX static library ../../lib/libstatic_swso_1.0.0.a
[100%] Built target static_swso
#编译完后的目录
.
├── bin
│   └── SWSO
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   │   ├── 3.10.2
│   │   │   ├── 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.c
│   │   ├── feature_tests.cxx
│   │   ├── Makefile2
│   │   ├── Makefile.cmake
│   │   ├── progress.marks
│   │   ├── SWSO.dir
│   │   │   ├── build.make
│   │   │   ├── cmake_clean.cmake
│   │   │   ├── CXX.includecache
│   │   │   ├── DependInfo.cmake
│   │   │   ├── depend.internal
│   │   │   ├── depend.make
│   │   │   ├── flags.make
│   │   │   ├── link.txt
│   │   │   ├── main.cpp.o
│   │   │   └── progress.make
│   │   └── TargetDirectories.txt
│   ├── cmake_install.cmake
│   ├── Makefile
│   └── src
│       ├── CMakeFiles
│       │   ├── CMakeDirectoryInformation.cmake
│       │   ├── progress.marks
│       │   ├── static_swso.dir
│       │   │   ├── build.make
│       │   │   ├── cmake_clean.cmake
│       │   │   ├── cmake_clean_target.cmake
│       │   │   ├── CXX.includecache
│       │   │   ├── DependInfo.cmake
│       │   │   ├── depend.internal
│       │   │   ├── depend.make
│       │   │   ├── flags.make
│       │   │   ├── link.txt
│       │   │   ├── progress.make
│       │   │   ├── sort.cpp.o
│       │   │   └── swap.cpp.o
│       │   └── swso.dir
│       │       ├── build.make
│       │       ├── cmake_clean.cmake
│       │       ├── CXX.includecache
│       │       ├── DependInfo.cmake
│       │       ├── depend.internal
│       │       ├── depend.make
│       │       ├── flags.make
│       │       ├── link.txt
│       │       ├── progress.make
│       │       ├── sort.cpp.o
│       │       └── swap.cpp.o
│       ├── cmake_install.cmake
│       └── Makefile
├── CMakeLists.txt
├── include
│   ├── sort.h
│   └── swap.h
├── lib
│   ├── libstatic_swso_1.0.0.a
│   └── libswso_1.0.0.so
├── main.cpp
└── src
    ├── CMakeLists.txt
    ├── sort.cpp
    └── swap.cpp
17 directories, 69 files
#运行编译生成的二进制可执行文件./bin/SWSO
Debug
15      10
arr1: 5 4 3 2 1 
arr2: 31.34 10.289 9.8 7.05 4 3.22
3
1
3
    
    
    4.4 CMake交叉编译工程(如openwrt_x86_64架构)
   
- 
     
 在CMakeLists.txt同目录下额外编写一个openwrt_x86_64.cmake文件
 set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_C_COMPILER /home/peter/lede/staging_dir/toolchain-x86_64_gcc-8.4.0_musl/bin/x86_64-openwrt-linux-musl-gcc) set(CMAKE_CXX_COMPILER /home/peter/lede/staging_dir/toolchain-x86_64_gcc-8.4.0_musl/bin/x86_64-openwrt-linux-musl-g++)
- 
     
 进入build文件夹执行如下指令:
 mkdir build cd build cmake -DCMAKE_TOOLCHAIN_FILE=../openwrt_x86_64.cmake .. make
 
