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