1.工程文件目录
include
mycpp.cpp
mycpp.h
CMakeLists.txt
-src
mymaincpp.cpp
-CMakeLists.txt
2.cmakelists.txt
CMakeLists,txt in the root
CMAKE_MINIMUM_REQUIRED(VERSION 3.10) #CMAKE的最小版本
PRIJECT(myproject) #生成的项目你想取啥名
AUX_SOURCE_DIRECTORY(src/ DIR_SRCS)#搜索src目录下的所有cpp文件,取名DIR_SRCS作为下面的添加路径
ADD_EXECUTABLE(myproject ${DIR_SRCS})#取DIR_SRCS目录下的所有文件生成名为myproject的可执行文件。
ADD_SUBDIRECTORY(./lib)#添加编辑的子文件路径
TARGET_LINK_LIBRARIES(myproject mylib)#让项目与静态库mylib做链接
CMakeLists,txt in Include.
aux_source_directory(. DIR_LIB_SRCS) #添加源文件路径 .就是当前路径
add_library(mylib STATIC ${DIR_LIB_SRCS}) #添加静态库文件路径
#静态库是不随更新而更改的 ,动态库SHARE是可以跟着更行而更改的
3.完整的工程文件目录
├── bin
│ └── CTEST
├── 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
│ └── TargetDirectories.txt
├── cmake_install.cmake
├── lib
│ ├── CMakeFiles
│ │ ├── CMakeDirectoryInformation.cmake
│ │ ├── lib.dir
│ │ │ ├── build.make
│ │ │ ├── cmake_clean.cmake
│ │ │ ├── cmake_clean_target.cmake
│ │ │ ├── CXX.includecache
│ │ │ ├── DependInfo.cmake
│ │ │ ├── depend.internal
│ │ │ ├── depend.make
│ │ │ ├── flags.make
│ │ │ ├── link.txt
│ │ │ ├── mycpp.cpp.o
│ │ │ └── progress.make
│ │ └── progress.marks
│ ├── cmake_install.cmake
│ ├── liblib.a
│ └── Makefile
├── Makefile
└── src
├── CMakeFiles
│ ├── CMakeDirectoryInformation.cmake
│ ├── CTEST.dir
│ │ ├── build.make
│ │ ├── cmake_clean.cmake
│ │ ├── CXX.includecache
│ │ ├── DependInfo.cmake
│ │ ├── depend.internal
│ │ ├── depend.make
│ │ ├── flags.make
│ │ ├── link.txt
│ │ ├── mytestmain.cpp.o
│ │ └── progress.make
│ └── progress.marks
├── cmake_install.cmake
└── Makefile
简化
build
src 放可行执行文件
├── CMakeLists.txt
└── mytestmain.cpp
lib 放自己的写的库文件
├── CMakeLists.txt
├── mycpp.cpp
└── mycpp.h
CMakeLists.txt
src 中的main文件和cmakelist
#include<iostream>
#include"../lib/mycpp.h" //注意引用根目录下的时候时 ../
using namespace std;
int main(int argc,char* argv[])
{
if(argc<3)
{
cout<<"Usage:"<<argv[0]<<"need more number"<<endl;
return 1;
}
double base= atof(argv[1]);
int exponent=atoi(argv[2]);
cout<<"result"<<power(base,exponent)<<endl;//自定意函数
cout<<"hello"<<endl;
return 0;
}
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib) #根目录的/lib,添加头文件搜索路径
AUX_SOURCE_DIRECTORY(./ DIR_SRCS) #当前目录(./)下的原文家
#把可执行文件设置在build下的bin目录中
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
ADD_EXECUTABLE(CTEST ${DIR_SRCS})#生可执行文件命名为 CTEST,源文件路径为DIR SRCS
TARGET_LINK_LIBRARIES(CTEST lib) #添加lib链接库链接CTEST可执行文件
lib中的.h,.cpp以及cmakelist文件。其中把库单独输出到build/lib文件夹中生成lib.a文件方便以后提取
#include<iostream>
using namespace std;
double power(const double& base,const double& exponent);
#include"./mycpp.h"//当前目录为./
double power(const double& base,const double& exponent)
{
int res=base;
if(base==1)return 1;
for(int i=1;i<exponent;i++)
{
res=res*base;
}
//res=1000;
return res;
}
aux_source_directory(. DIR_LIB_SRCS) #当前目录下所有源文件命名为dir_lib_srcs
#在那个文件下make哪个文件夹路径就是project_binary_dir,所以就是build下
#设置库文件的输出路径,设置之后可以单独拿出库文件
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
add_library(lib STATIC ${DIR_LIB_SRCS})# 把dir下的文件编译为名为lib的静态库
根目录下的cmakelist
CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
PROJECT(CTEST)
ADD_SUBDIRECTORY(./lib)#添加子目录
ADD_SUBDIRECTORY(./src)
编译的时候在build文件中cmake … ,编译出makefile后,直接make。最后生成的可执行文件在build的bin下
4.自定义编译
src下的cmakelist
#把可执行文件设置在build下的bin目录中
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
AUX_SOURCE_DIRECTORY(./ DIR_SRCS) #当前目录(./)下的原文家
#自定义编译文件路径,这个文件可以控制是否编译文件
CONFIGURE_FILE(
#输入文件名需要自己提前编写
"${PROJECT_SOURCE_DIR}/config/config.hpp.in"
#输出文件名,根据输入文件,直接在config文件下输出config.hpp文件
"${PROJECT_SOURCE_DIR}/config/config.hpp"
)
#选项USE_CPP 开
OPTION(USE_CPP ON)
#如果use cpp开 就包含lib库下的库文件
IF(USE_CPP)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib) #根目录的/lib,添加头文件搜索路径
ENDIF(USE_CPP)
ADD_EXECUTABLE(CTEST ${DIR_SRCS})#生可执行文件命名为 CTEST,源文件路径为DIR SRCS
TARGET_LINK_LIBRARIES(CTEST lib) #添加lib链接库链接CTEST可执行文件
src下的main.cpp
#include<iostream>
#include"../config/config.hpp"
using namespace std;
#ifdef USE_CPP
#include"../lib/mycpp.h"
#else
#include<math.h>
#endif
int main(int argc,char* argv[])
{
if(argc<3)
{
cout<<"Usage:"<<argv[0]<<"need more number"<<endl;
return 1;
}
double base= atof(argv[1]);
int exponent=atoi(argv[2]);
#ifdef USE_CPP
cout<<"MYCPP result"<<power(base,exponent)<<endl;
#else
cout<<"standard-math result"<<pow(base,exponent);
#endif
cout<<"hello"<<endl;
return 0;
}
添加一个config文件夹。文件夹下创建config.hpp.in文件
这句话可以用来创建config.hpp里的内容。光标移动到USE_CPP回车,c 为调整,g为保存后退出。
#cmakedefine USE_CPP
最后在安装ccmake,通过ccmake … 来调试define的选项
sudo apt-get install cmake-curses-gui
5.vscode下GDB调试
修改根目录cmakelist
CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
PROJECT(CTEST)
#定义c++编译版本
add_definitions(-std=c++11)
set(CMAKE_BUILD_TYPE "DEBUG")
#“”外的大小写无所谓,内必须跟命令一致。注意时O0,O3 ou0,ou3
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(cmake_cxx_flags_release "$ENV{CXXFLAGS} -O3 -Wall")
ADD_SUBDIRECTORY(./lib)#添加子目录
ADD_SUBDIRECTORY(./src)
debug时的gdb设置
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
//workspaceFolder就是根目录。a.out是可执行文件
//"program": "{workspaceFolder}/a.out",
"program": "${workspaceFolder}/build/bin/CTEST",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
1.demo代码下载
https://github.com/AdamWSL/CMake_Tutorial.git
2.cmake下载地址
https://cmake.org/download/
3.CMake官方教程— CMake 3.17.0-rc1文档
https://cmake.org/cmake/help/latest/guide/tutorial/index.html
4.CMake入门实战(看完这篇再看视频效果更佳)
https://www.hahack.com/codes/cmake/
5.cmake使用示例与整理总结
https://blog.csdn.net/QTVLC/article/details/82380413
6.CMake命令/函数汇总(翻译自官方手册)
https://www.cnblogs.com/52php/p/5684588.html