CMake在ubuntu下的使用(3)

前面学习了cmake的基本用法,一级install和测试,下面学习一些其他功能,加载第三方库,在下一节学习,例子我会上传,上传后,我会修改博客放上链接。


支持 gdb

     ~~~~     让 CMake 支持 gdb 的设置也很容易,一般我就使用gcc就是加-g生成调试信息:

set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

之后可以直接对生成的程序使用 gdb 来调试。

添加环境检查

源码路径:demo.

     ~~~~     我们前面通过添加宏USE_MYMATH来判断是否使用我们自己的库,在实际使用中,我们就需要判断环境来时用不同的函数,根据不同的平台使用不同的函数。
     ~~~~     我们需要先将我们的加法函数改一下,改成两个数的绝对值相加,函数改动如下:

#include <stdio.h>
#include "sumfun.h"
int sum_test(int val1, int val2){
//    return val1 + val2;
    return (val1>0?val1:-val1) + (val2>0?val2:-val2);
}

     ~~~~     我们在修改mian.cpp:

#include <stdio.h>
#include <stdlib.h>
#include "config.h"
#ifdef ABS_EXISTS
  #include <math.h>
#else
  #include "sub1/sumfun.h"
#endif

int main(int argc, char *argv[])
{
    if (argc < 3){
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }
    int iVal1 = atof(argv[1]);
    int iVal2 = atoi(argv[2]);

#ifdef ABS_EXISTS
    printf("Now we use the standard. \n");
    int result = abs(iVal1) + abs(iVal2);
#else
    printf("Now we use our own Math library. \n");
    int result = sum_test(iVal1, iVal2);
#endif
    printf("|%d| + |%d| = %d\n", iVal1, iVal2, result);
    return 0;
}

     ~~~~     现在我们就可以判断系统是否有abs这个函数来选择,如果有就不使用我们提供的库,没有就是用我们提供的库,就像游戏,有时候你的显卡不支持某一些功能,他就会使用调用cpu函数,而不会去调用显卡。
     ~~~~     首先我们在根目录的CMakeList.txt文件中添加宏CheckFunctionExists,这样我们就可以调用 check_function_exists 命令测试链接器是否能够在链接阶段找到abs函数,然后把保存到ABS_EXISTS,之前我们就是使用USE_MYMATH这个来判断是否使用我们的库,现在去掉,不需要了。

# 检查系统是否支持abs函数
include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
check_function_exists (abs ABS_EXISTS)

     ~~~~     在这之前我们需要先建头文件包含进去,设置CMAKE_INCLUDE_CURRENT_DIR 为NO即可,默认是OFF。

set (CMAKE_INCLUDE_CURRENT_DIR ON)

     ~~~~     然后修改config.h.in:

#cmakedefine ABS_EXISTS

添加版本号

源码路径:demo.

     ~~~~     添加版本号利于维护和整理,同时出了问题可以先回到之前稳定的版本,这是个好习惯号养成(这是有血的教训的)。
     ~~~~     原理很简单,我们在根目录的CMakeList.txt中添加两个宏记录主版本和副版本,名称没有要求:

set (TEST_VERSION_MAJOR 1)
set (TEST_VERSION_MINOR 0)

     ~~~~     然后在config.h.in后面增加,就是将设置的值赋值给VERSION_MAJOR和VERSION_MINOR宏,然后在mian.cpp中调用这两个宏就可以了。

#define VERSION_MAJOR @TEST_VERSION_MAJOR@
#define VERSION_MINOR @TEST_VERSION_MINOR@

     ~~~~     修改mian.cpp:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "config.h"
#ifdef ABS_EXISTS
  #include <math.h>
#else
  #include "sub1/sumfun.h"
#endif

int main(int argc, char *argv[])
{
    if(argc == 2){
        if(strcmp(argv[1], "-v") == 0){
            printf("%s Version %d.%d\n",
                argv[0],
                VERSION_MAJOR,
                VERSION_MINOR);
            return 0;
        }
    }
    if (argc < 3){
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }
    int iVal1 = atof(argv[1]);
    int iVal2 = atoi(argv[2]);

#ifdef ABS_EXISTS
    printf("Now we use the standard. \n");
    int result = abs(iVal1) + abs(iVal2);
#else
    printf("Now we use our own Math library. \n");
    int result = sum_test(iVal1, iVal2);
#endif
    printf("|%d| + |%d| = %d\n", iVal1, iVal2, result);
    return 0;
}

生成安装包

源码路径:demo.

     ~~~~     本节将学习如何配置生成各种平台上的安装包,包括二进制安装包和源码安装包。为了完成这个任务,我们需要用到 CPack ,它同样也是由 CMake 提供的一个工具,专门用于打包。
     ~~~~     首先在顶层的 CMakeLists.txt 文件尾部添加下面几行:

# 构建一个 CPack 安装包
include (InstallRequiredSystemLibraries)
set (CPACK_RESOURCE_FILE_LICENSE
  "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set (CPACK_PACKAGE_VERSION_MAJOR "${TEST_VERSION_MAJOR}")
set (CPACK_PACKAGE_VERSION_MINOR "${TEST_VERSION_MINOR}")
include (CPack)

     ~~~~     主要是导入InstallRequiredSystemLibraries 模块,后面才能导入CPack,中间是设置版权信息和版本信息,最后面导入CPack。
     ~~~~     生成二进制安装包:

cpack -C CPackConfig.cmake

     ~~~~     生成源码安装包:

cpack -C CPackSourceConfig.cmake

cmake增加对openmp的支持

     ~~~~     在CMakeList.txt中增加:

FIND_PACKAGE( OpenMP REQUIRED) 
if(OPENMP_FOUND) 
    message("OPENMP FOUND") 
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") 
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") 
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") 
    set(CMAKE_SHARE_LINKER_FLAGS "${CMAKE_SHARE_LINKER_FLAGS} ${OpenMP_SHARE_LINKER_FLAGS}") 
endif()

将其他平台的项目迁移到 CMake

CMake 可以很轻松地构建出在适合各个平台执行的工程环境。而如果当前的工程环境不是 CMake ,而是基于某个特定的平台,是否可以迁移到 CMake 呢?答案是可能的。下面针对几个常用的平台,列出了它们对应的迁移方案。

autotools
am2cmake 可以将 autotools 系的项目转换到 CMake,这个工具的一个成功案例是 KDE 。
Alternative Automake2CMake 可以转换使用 automake 的 KDevelop 工程项目。
Converting autoconf tests
qmake
qmake converter 可以转换使用 QT 的 qmake 的工程。
Visual Studio
vcproj2cmake.rb 可以根据 Visual Studio 的工程文件(后缀名是 .vcproj 或 .vcxproj)生成 >CMakeLists.txt 文件。
vcproj2cmake.ps1 vcproj2cmake 的 PowerShell 版本。
folders4cmake 根据 Visual Studio 项目文件生成相应的 “source_group” 信息,这些信息可以很>方便的在 CMake 脚本中使用。支持 Visual Studio 9/10 工程文件。
CMakeLists.txt 自动推导
gencmake 根据现有文件推导 CMakeLists.txt 文件。
CMakeListGenerator 应用一套文件和目录分析创建出完整的 CMakeLists.txt 文件。仅支持 >Win32 平台。

学习来源:https://www.hahack.com/codes/cmake/#

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值