CMAKE使用

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值