CMake入门2:添加库

建构自己的库

把库放到一个独立的文件夹。
在工程目录下新建 mathfunction的子目录中。
在这个文件夹中新建CMakeLists.txt文件。
包含以下一行代码:

add_library(MathFunctions mysqrt.cpp)

新建 MathFunctions.h,在里面定义

// 声明函数的形式
double mysqrt(double x);

在这个文件夹中创建源文件mysqrt.cpp。在里面实现这个函数。

添加这个新库到项目

为了利用新库,在工程根目录下的 CMakeLists.txt
添加 add_subdirectory() 来构建我们自己的库。

最后一个更改是将新库添加到可执行文件。

include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions") 
add_subdirectory (MathFunctions) 
# add the executable
add_executable (Tutorial tutorial.cxx) 
target_link_libraries (Tutorial MathFunctions)

构建可选选项

MathFunctions是我们自己构建的库,有时候我们需要控制这个库是否应该使用。
可以为使用这个库添加一个开关,在构建大型项目时非常有用。

在项目根目录下的 CMakeLists.txt 添加如下代码:

# 构建可选选项
## should we use our own math functions?
## 是否使用我们的math函数库?
## 若OFF,则整个库都不会进行编译
option (USE_MYMATH 
        "Use tutorial provided math implementation" ON)

假如使用的是CMake GUI,USE_MYMATH默认值是用户可以根据需要更改。

在这里插入图片描述
为了能控制这个变量。
我们可以加一个 Configure.h 的头文件来定义这个宏。

Configure.h.in代码如下:

// 这个文件可以作为整个项目宏定义的配置
// option (USE_MYMATH "Use tutorial provided math implementation" ON)
// 头文件会变成:
// #cmakedefine USE_MYMATH 会变为 #define USE_MYMATH
// option (USE_MYMATH "Use tutorial provided math implementation" OFF)
// 头文件会变成:
// #cmakedefine USE_MYMATH 会变为 /* #undef USE_MYMATH */
#cmakedefine USE_MYMATH

在根目录的 CMakeLists.txt 添加这个头文件。代码如下:

# 项目的宏定义配置头文件
configure_file(
	"${PROJECT_SOURCE_DIR}/Configure.h.in"
	"${PROJECT_BINARY_DIR}/Configure.h"
)

使用USE_MYMATH的设置来确定是否应该编译和使用mathfunction库。

if (USE_MYMATH)
	# 添加要使用库所在目录
	include_directories("${PROJECT_SOURCE_DIR}/MathFunctions")
	add_subdirectory(MathFunctions)
	# 使用一个变量(在本例中是EXTRA_LIBS)来设置可选的库
	set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif(USE_MYMATH)

完整的根目录CMakeLists代码为:

# CMake最低版本要求
cmake_minimum_required (VERSION 2.6)
# 项目名称
project (Tutorial)

# 使用变量,添加版本号
set(Tutorial_VERSION_MAJOR 1)
set(Tutorial_VERSION_MINOR 0)

# configure a header file to pass some of the CMake settings to the source code
# 配置一个头文件来传递一些CMake的设置信息
configure_file(
	"${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
	"${PROJECT_BINARY_DIR}/TutorialConfig.h"
)

# 项目的宏定义配置头文件
configure_file(
	"${PROJECT_SOURCE_DIR}/Configure.h.in"
	"${PROJECT_BINARY_DIR}/Configure.h"
)

# add the binary tree to the search path for include files
# so that we will find TutorialConfig.h
# 添加 binary tree 让我们可以搜到所需文件
include_directories("${PROJECT_BINARY_DIR}")

# 构建可选选项
## should we use our own math functions?
## 是否使用我们的math函数库?
## 若OFF,则整个库都不会进行编译
option (USE_MYMATH 
        "Use tutorial provided math implementation" ON)
		
if (USE_MYMATH)
	# 添加要使用库所在目录
	include_directories("${PROJECT_SOURCE_DIR}/MathFunctions")
	add_subdirectory(MathFunctions)
	# 使用一个变量(在本例中是EXTRA_LIBS)来设置可选的库
	set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif(USE_MYMATH)

# add the executable
# 添加源文件
add_executable(Tutorial tutorial.cpp)
# 将新库添加到可执行文件
target_link_libraries(Tutorial ${EXTRA_LIBS})

项目的CPP代码为:

// A simple program that computes the square root of a number
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "TutorialConfig.h"
#include "Configure.h"
#ifdef USE_MYMATH
#include "MathFunctions.h"
#endif
int main(int argc, char *argv[])
{
	if (argc < 2)
	{
		fprintf(stdout,"%s Version %d.%d\n",
            argv[0],
            Tutorial_VERSION_MAJOR,
            Tutorial_VERSION_MINOR);
		fprintf(stdout, "Usage: %s number\n", argv[0]);
		return 1;
	}
	double inputValue = atof(argv[1]);
#ifdef USE_MYMATH
	double outputValue = mysqrt(inputValue);
	#else
	double outputValue = sqrt(inputValue);
#endif
	fprintf(stdout, "The square root of %g is %g\n",
		inputValue, outputValue);
	return 0;
}

使用第三方库

  • 命名变量
set(INC_DIR /usr/local/include)
set(LINK_DIR /usr/local/lib)
  • 去哪里找头文件
include_directories(${INC_DIR})
  • 去哪里找库文件 .so .dll .dylib
link_directories(${LINK_DIR})
  • 要链接的库文件的名字
target_link_libraries(target_project libs_name)

示例程序:

# CMake最低版本要求
cmake_minimum_required (VERSION 2.6)
# 项目名称
project (Tutorial)

#头文件目录
set(INC_DIR "${PROJECT_SOURCE_DIR}/include")
#库目录
set(LINK_DIR "${PROJECT_SOURCE_DIR}/libs")

#去哪里找头文件
include_directories(${INC_DIR})
#去哪里找库文件
link_directories(${LINK_DIR})

include_directories("${PROJECT_BINARY_DIR}")

# 添加源文件
add_executable(Tutorial tutorial.cpp)
# 将新库添加到可执行文件
set(EXTRA_LIBS MathFunctions)
target_link_libraries(Tutorial ${EXTRA_LIBS})

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值