静态库:多个.o文件的打包,可以将库直接插入生成的可执行文件中,可执行文件在运行时无需找.a文件,自己可以独立运行。但是,当a.o和b.o都使用了某函数时,该函数的源码会被拷贝两次到.a库,这样就会浪费空间。
动态库:可执行文件运行时能在同目录或者系统目录找到.so文件,才可以正常运行,否则会报错说找不到动态库文件。
作用:生成动态库或静态库
第1个参数:指定库的名字;
第2个参数:决定是动态(shared)还是静态(static),如果没有就默认静态;或者使用关键字ALIAS,它是为了设置别名。
第3个参数:指定生成库的源文件。
调用方式:
add_library(hello_library STATIC
src/hello.cpp
)
# 修改hello_library为别名hello::library
add_library(hello::library ALIAS hello_library)
其他相关指令:
set_target_properties: 设置输出的名称,还有其它功能,如设置库的版本号等等。
作用:将头文件目录包含在库中
第1个参数:指定库的名字;
第2个参数:作用域
第3个参数:指定生成库的源文件。
调用方式:
target_include_directories(
hello_library
PUBLIC
${PROJECT_SOURCE_DIR}/include
)
作用:在使用库时,告知编译器有关库的信息。
第1个参数:已经创建库文件;
第2个参数:作用域
第3个参数:指定使用库的源文件。
target_link_libraries(
hello_binary
PRIVATE
hello_library
)
math目录下放置了需要生成库的文件:
包括头文件和源文件
MathFunctions.h
#ifndef POWER_H
#define POWER_H
extern double power(double base, int exponent);
#endif
MathFunctions.cpp
/**
* power - Calculate the power of number.
* @param base: Base value.
* @param exponent: Exponent value.
*
* @return base raised to the power exponent.
*/
double power(double base, int exponent)
{
int result = base;
int i;
if (exponent == 0)
{
return 1;
}
for (i = 1; i < exponent; ++i)
{
result = result * base;
}
return result;
}
在math目录下创建CMakeLists.txt,其内容为:
# 项目根目录CMakeLists.txt
# 指定运行此配置文件所需的CMake的最低版本
cmake_minimum_required (VERSION 3.0)
# 项目信息---项目名称是Demo1
project (Demo1)
# 生成链接库
add_library (MathFunctions SHARED ${PROJECT_SOURCE_DIR}/MathFunctions.cpp)
# CMAKE_INSTALL_PREFIX选择可执行文件安装的路径
# 将生成库放在当前项目目录的math/install/lib文件夹下
# 将生成库相关的.h文件放在当前项目目录的math/install/include文件夹下
set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}/install)
install(TARGETS MathFunctions LIBRARY DESTINATION lib)
install(FILES ${PROJECT_SOURCE_DIR}/math/MathFunctions.h DESTINATION include)
在math目录下执行以下命令:
mkdir build
cd build
cmake …
make
make install
此时静态/动态库被安装到项目目录math/install/lib文件夹下,相关的头文件被安装到项目目录math/install/include文件夹下。
创建新项目,将前面install目录下的文件全部复制到新项目目录下。
在项目目录下创建main.cpp文件:
main.cpp
#include
#include
#include "math/MathFunctions.h"
int main(int argc, char *argv[])
{
if (argc < 3)
{
printf("Usage: %s base exponent \n", argv[0]);
return 1;
}
double base = atof(argv[1]);
int exponent = atoi(argv[2]);
printf("Now we use our own Math library. \n");
double result = power(base, exponent);
printf("%g ^ %d is %g\n", base, exponent, result);
return 0;
}
在项目目录下创建CMakeLists.txt文件,其内容为:
cmake_minimum_required(VERSION 3.16)
project(Demo)
set(CMAKE_CXX_STANDARD 14)
# 共享库搜索路径
link_directories (${PROJECT_SOURCE_DIR}/lib)
add_executable(Demo main.cpp)
# 告诉编译器头文件在哪个位置
include_directories( ${PROJECT_SOURCE_DIR}/include)
# 把目标文件与库文件进行链接
target_link_libraries (Demo libMathFunctions.so)
在当前项目目录下执行以下命令:
mkdir build
cd build
cmake …
make
./Demo 1 3(执行可执行文件,并将参数传递给main函数)