CMake笔记2

配置文件的相关配置
项目目录下创建linconfConfig.in.h文件

在这里插入图片描述

该文件中写入如下语句

仅仅是两个宏定义而已,但是尽量保证 项目名_VERSION_MAJOR的形式

#define lincong_VERSION_MAJOR @lincong_VERSION_MAJOR@
#define lincong_VERSION_MINOR @lincong_VERSION_MINOR@
更改首级CMakeLists.txt添加配置文件
cmake_minimum_required(VERSION 3.10.4)

# project(lincong VERSION)
# 给予名字的时候顺便赋予版本
project(lincong VERSION 1.7) 

# 给项目添加配置文件,大概的意思就是将lincongConfig.h.in文件转化为lincongConfig.h文件,然后在主函数中引入
# 设置配置文件,将.h.in文件转变为.h文件格式
configure_file(lincongConfig.h.in lincongConfig.h)
# 在这里我解释一下,${PROJECT_BINARY_DIR}仅仅只是为了找到Config.h文件而已,正好lincong.o可执行文件和Config.h头文件在一起
# 所以这样做的目的仅仅是为了找到lincongConfig.h,而这个.h文件就是由.h.in文件生成

# 下面的系统的CMAKE_CURRENT_BINARY_DIR指的就是当前路径下的CMakeLists.txt所在的路径加入到链接的头文件中
# target_include_directories实际上和include_directories是一样的性质
#  out-of-source 编译,他指的是 target 编译目录。使用我们上面提到的 ADD_SUBDIRECTORY(src bin)可以更改这个变量的值。相当与就是还没有切换编译目录,还是保持在最外层

include_directories(${CMAKE_CURRENT_BINARY_DIR})

# 上面这句话在英文中的解释,One may then use the include_directories() command to specify the output directory as an include directory:
# so that sources may include the header as #include <lincongConfig.h>.

# 因此CMake将lincongConfig.h使用configure_file将lincong.Config.h.in文件转化之后的输出目录与


# 下面的语句生成.o文件,linux平台下的可执行文件
add_executable(${PROJECT_NAME} src/main.cpp)

#在链接库目录之前先进行子集目录的编译
add_subdirectory(Adder)

#第二,为了我们引入头文件的便捷性,我们应该将头文件路径指出
target_include_directories(${PROJECT_NAME} PUBLIC Adder )


# 将自己编译的各个静态库部分链接到项目上
#addlib的名字为编译子目录的时候所取的名字
target_link_libraries(${PROJECT_NAME} addlib)

# 接下来是引入外部的GLFW部分

# 第一步,告诉CMake去哪里编译库
add_subdirectory(external/glfw)

# 第二步,链接头文件目录,这个目录是源文件所在位置文件所在位置而不是编译
target_include_directories(${PROJECT_NAME} 
    PUBLIC external/glfw/include)
# 第三步,链接静态库
target_link_libraries(${PROJECT_NAME} glfw)
main.cpp文件中更改如下

可能下面的情况就是你引入lincongConfig.h这个头文件会报错,因为我们并没有执行configure_file函数将我们的.in.h文件转化为.h文件。

#include <iostream>
#include "add.h"
//下面的这个引入方式就和那个链接的库目录接上的

#include "GLFW/glfw3.h"

#include "GLFW/glfw3native.h"

//引入配置文件
#include "lincongConfig.h"

using namespace std;

int main(int argc,char* argv[]) {
    cout<<"iM YOUR FATHER!";
    cout<<"a+b="<<add(33.33,44.44)<<"\n";
    GLFWwindow* window;
    
    if( !glfwInit() )
    {
        fprintf( stderr, "Failed to initialize GLFW\n" );
        exit( EXIT_FAILURE );
    }
   window = glfwCreateWindow( 300, 300, "Gears", NULL, NULL );
    if (!window)
    {
        fprintf( stderr, "Failed to open GLFW window\n" );
        glfwTerminate();
        exit( EXIT_FAILURE );
    }
    // Main loop
    while( !glfwWindowShouldClose(window) )
    {
        // Swap buffers
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    // Terminate GLFW
    glfwTerminate();

    //输出软件版本信息
    cout<<argv[0]<<" Version="<<lincong_VERSION_MAJOR<<"."<<lincong_VERSION_MINOR<<endl;
    return 0;
}
CMake常见变量的理解
背景

其实很多时候我们会觉得CMake很麻烦,尤其是自己编写脚本的时候,为啥不直接使用GUI呢,CMake-GUI那么舒服又可以可视化显示错误,还可以直接通过勾选的方式进行option off/on的设置,为什么我们还要执着于学习脚本去编译这个效果。
其实真实的情况下,传统的CMake-gui并不能像我们的Terminal一样可以在虚拟环境中运行我们的环境,如果没有了虚拟环境给CMake加Buff,那么试想一下所有的东西都要直接安装在Windows中,Linux中,还要配置相关的环境变量等一系列的问题,所以麻烦事显然就更多了,所以说gui只是一个协助我们开发的手段而已。

CMAKE_BINARY_DIR,PROJECT_BINARY_DIR, _BINARY_DIR

这三个变量指代的内容是一致的,如果是 in source 编译,指得就是工程顶层目录,如果是 out-of-source 编译,指的是工程编译发生的目录。PROJECT_BINARY_DIR 跟其他指令稍有区别,现在,你可以理解为他们是一致的。

CMAKE_SOURCE_DIR PROJECT_SOURCE_DIR,_SOURCE_DIR

这三个变量指代的内容是一致的,不论采用何种编译方式,都是工程顶层目录。
也就是在 in source 编译时,他跟 CMAKE_BINARY_DIR 等变量一致。
PROJECT_SOURCE_DIR 跟其他指令稍有区别,现在,你可以理解为他们是一致的。

CMAKE_CURRENT_SOURCE_DIR

指的是当前处理的 CMakeLists.txt 所在的路径,比如上面我们提到的 src 子目录。

CMAKE_CURRRENT_BINARY_DIR

如果是 in-source 编译,它跟 CMAKE_CURRENT_SOURCE_DIR 一致,如果是 out-of-source 编译,他指的是 target 编译目录。
使用我们上面提到的 ADD_SUBDIRECTORY(src bin)可以更改这个变量的值。
使用 SET(EXECUTABLE_OUTPUT_PATH <新路径>)并不会对这个变量造成影响,它仅仅修改了最终目标文件存放的路径。

CMAKE_CURRENT_LIST_FILE

输出调用这个变量的 CMakeLists.txt 的完整路径

CMAKE_CURRENT_LIST_LINE

输出这个变量所在的行

CMAKE_MODULE_PATH

这个变量用来定义自己的 cmake 模块所在的路径。如果你的工程比较复杂,有可能会自己编写一些 cmake 模块,这些 cmake 模块是随你的工程发布的,为了让 cmake 在处理CMakeLists.txt 时找到这些模块,你需要通过 SET 指令,将自己的 cmake 模块路径设置一下。
比如
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
这时候你就可以通过 INCLUDE 指令来调用自己的模块了。

EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH

分别用来重新定义最终结果的存放目录,前面我们已经提到了这两个变量。

PROJECT_NAME

返回通过 PROJECT 指令定义的项目名称。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值