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

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

目录结构:
CMake 在Linux上使用动态库和静态库_第1张图片
将上一篇生成的libhello.so放到dynamic目录中,libhello_static.a放到static目录中,build空目录是将来生成文件存放的目录。

一、使用动态库

hello.h文件中:

#ifndef HELLO_H
#define HELLO_H
#include 

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

CMake 在Linux上使用动态库和静态库_第2张图片

二、使用静态库

只需要在上面的例子中,修改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)

编译步骤不变,看看我们生成的文件:
CMake 在Linux上使用动态库和静态库_第3张图片
静态库版本生成的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)