CMake 在Linux上使用动态库和静态库

上一篇我们生成了动态库和静态库,这一篇我们要将他们使用起来。

目录结构:
在这里插入图片描述
将上一篇生成的libhello.so放到dynamic目录中,libhello_static.a放到static目录中,build空目录是将来生成文件存放的目录。

一、使用动态库

hello.h文件中:

#ifndef HELLO_H
#define HELLO_H
#include <iostream>

void HelloFunc();

#endif

main.cpp

#include "hello.h"

int main()
{
    HelloFunc();
    return 0;
}

CMakeLists.txt

cmake_minimum_required (VERSION 2.6)

project(hello_cmake)

#//头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)

#//生成可执行文件
add_executable(hello_cmake main.cpp)

#//链接库到可执行文件
target_link_libraries(hello_cmake ${PROJECT_SOURCE_DIR}/dynamic/libhello.so)

或者写成:

cmake_minimum_required (VERSION 2.6)

project(hello_cmake)

#//头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)

#添加动态库目录
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/dynamic)

#//生成可执行文件
add_executable(hello_cmake main.cpp)

#//链接库到可执行文件
target_link_libraries(hello_cmake libhello.so)

target_link_libraries(hello_cmake ${PROJECT_SOURCE_DIR}/dynamic/libhello.so)

等于

#添加动态库目录
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/dynamic)

#//链接库到可执行文件
target_link_libraries(hello_cmake libhello.so)

说明:
target_link_libraries的第一个参数是自己设置的项目名——project(hello_cmake)

TARGET_LINK_LIBRARIES
语法:

target_link_libraries(<target> [item1 [item2 [...]]]
                      [[debug|optimized|general] <item>] ...)

以下三种写法是相同的:

target_link_libraries(myProject libhello.so)  #这些库名写法都可以。
target_link_libraries(myProject hello)
target_link_libraries(myProject -lhello)

在这里插入图片描述
命令:

ls -l

在这里插入图片描述

二、使用静态库

只需要在上面的例子中,修改CMakeLists.txt文件:

cmake_minimum_required (VERSION 2.6)

project(hello_cmake)

#//头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)

#添加静态库目录
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/static)

#//生成可执行文件
add_executable(hello_cmake main.cpp)

#//链接库到可执行文件
target_link_libraries(hello_cmake libhello_static.a)

编译步骤不变,看看我们生成的文件:
在这里插入图片描述
静态库版本生成的hello_cmake体积是9160,动态库版本生成的hello_cmake体积大小是8612

把static目录中的libhello_static.a名字改成libhello.a
在这里插入图片描述
修改CMakeLists.txt中的最后一行,三种写法都是可以的。(不信的话,你可以用ls -l 查看生成的hello_cmake的体积大小了)

cmake_minimum_required (VERSION 2.6)

project(hello_cmake)

#//头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)

#添加静态库目录
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/static)

#//生成可执行文件
add_executable(hello_cmake main.cpp)

#//链接库到可执行文件,以下三种写法都是可以的
#target_link_libraries(hello_cmake libhello.a)
#target_link_libraries(hello_cmake hello.a)
target_link_libraries(hello_cmake hello)

参考:
CMake 添加需要链接的库文件目录LINK_DIRECTORIES

CMake 设置要链接的库文件的名称TARGET_LINK_LIBRARIES

target_link_libraries

linux下生成动态链接库并使用(使用cmake)

如何在cmake中引用静态库(.a)

Linux下CMake生成和调用动态库

使用 CMake 编译动态库静态库,你可以按照以下步骤进行操作: 1. 创建一个 CMakeLists.txt 文件,该文件描述了构建过程和项目配置。 2. 在 CMakeLists.txt 文件中,使用 `add_library` 命令来定义要构建的库。使用 `SHARED` 参数来指定动态库使用 `STATIC` 参数来指定静态库。例如: ```cmake # 构建动态库 add_library(mylib SHARED src/mylib.cpp) # 构建静态库 add_library(mylib_static STATIC src/mylib.cpp) ``` 3. 如果你有多个源文件,可以将它们一起添加到库中: ```cmake # 构建动态库 add_library(mylib SHARED src/mylib.cpp src/other.cpp) # 构建静态库 add_library(mylib_static STATIC src/mylib.cpp src/other.cpp) ``` 4. 如果你想为库定义公共头文件目录,可以使用 `target_include_directories` 命令。例如: ```cmake target_include_directories(mylib PUBLIC include) ``` 5. 如果你希望链接其他库到你的库中,可以使用 `target_link_libraries` 命令。例如: ```cmake target_link_libraries(mylib PUBLIC otherlib) ``` 6. 最后,在 CMakeLists.txt 文件中添加一个 `install` 命令,以便在构建过程完成后安装库文件到指定的目录。例如: ```cmake install(TARGETS mylib DESTINATION lib) install(FILES include/mylib.h DESTINATION include) ``` 7. 运行 CMake 命令来生成构建系统所需的文件: ```shell cmake . ``` 8. 使用生成的构建系统来编译和构建库: ```shell make ``` 在构建过程完成后,你将在指定的目录(例如 `lib`)中找到生成的动态库静态库文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值