前面学习了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)
#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 平台。