cmake动态库与静态库

动态库与静态库

静态库:多个.o文件的打包,可以将库直接插入生成的可执行文件中,可执行文件在运行时无需找.a文件,自己可以独立运行。但是,当a.o和b.o都使用了某函数时,该函数的源码会被拷贝两次到.a库,这样就会浪费空间。
动态库:可执行文件运行时能在同目录或者系统目录找到.so文件,才可以正常运行,否则会报错说找不到动态库文件。

相关命令

add_library()

作用:生成动态库或静态库
第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: 设置输出的名称,还有其它功能,如设置库的版本号等等。

target_include_directory()

作用:将头文件目录包含在库中
第1个参数:指定库的名字;
第2个参数:作用域

  • PRIVATE - 将目录添加到此目标的include目录中
  • INTERFACE - 将该目录添加到任何链接到此库的目标的include目录中(不包括自己)。
  • PUBLIC - 它包含在此库中,也包含在链接此库的任何目标中。

第3个参数:指定生成库的源文件。
调用方式:

target_include_directories(
		hello_library
    PUBLIC
    ${PROJECT_SOURCE_DIR}/include
)

target_link_library()

作用:在使用库时,告知编译器有关库的信息。
第1个参数:已经创建库文件;
第2个参数:作用域

  • PRIVATE - 将目录添加到此目标的include目录中
  • INTERFACE - 将该目录添加到任何链接到此库的目标的include目录中(不包括自己)。
  • PUBLIC - 它包含在此库中,也包含在链接此库的任何目标中。

第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 <stdio.h>
#include <stdlib.h>
#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函数)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jasmine-Lily

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值