建构自己的库
把库放到一个独立的文件夹。
在工程目录下新建 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})