Windows+WinGW 使用CMake 构建动态库、静态库及使用动态库

零、理解动态库、静态库

在完成接口开发后,为了给其他开发人员调用,通常需要将这部分代码打包生成动态链接库文件。

动态链接库很好地保证了代码的封装性和独立性,作为接口,它可以很好地独立于主程序,便于更新。调用接口的主程序编译时也会绕过已生成的动态链接库,仅作连接,在运行时使用它,减少了前端人员编译的时间消耗。

同时由于动态链接库很难被反编译,只有头文件是可见的,这也同时保证了代码的安全性。

在Windows系统上,以.dll为后缀的是动态链接库,以.a结尾的是静态链接库。

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持
 

一、动态库、静态库的构建

haha.h

#ifndef HAHA_H
#define HAHA_H

#pragma once
#include<iostream>
void haha();

#endif // HAHA_H

haha.cpp

#include "haha.h"
using namespace std;
void haha(){
    cout << "haha!" << endl;
}

main.cpp

#include <iostream>

using namespace std;


int main()
{

    cout << "Hello World!" << endl;
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(01-opencv-test LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 添加头文件搜索路径
include_directories(./)

# 搜索工程目录下的.cpp文件
aux_source_directory(./ SRC_LIST)

# 生成可执行文件
add_executable(${PROJECT_NAME} ${SRC_LIST})

# 构建动态库
add_library(haha SHARED haha.cpp)

# 构建静态库
#add_library(haha_staic STATIC haha.cpp)


# 设置可执行文件输出路径
set(EXECUTABLE_OUTPUT_PATH ./bin)

# 设置库文件输出路径
set(LIBRARY_OUTPUT_PATH ./lib)

动态库结果文件:

libhaha.dll

libhaha.dll.a  这个文件一般没有用

构建静态库结果文件:

libhaha_static.a

二、动态库的使用

就比如使用OpenCV的库

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(untitled1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 添加头文件搜索路径
include_directories(D:/software/opencv3.4.0/OpenCV-MinGW-Build-OpenCV-3.4.5/include
    D:/software/opencv3.4.0/OpenCV-MinGW-Build-OpenCV-3.4.5/include/opencv
    D:/software/opencv3.4.0/OpenCV-MinGW-Build-OpenCV-3.4.5/include/opencv2)

# 库文件列表(dll文件)
file(GLOB_RECURSE OpenCV_LIBS D:/software/opencv3.4.0/OpenCV-MinGW-Build-OpenCV-3.4.5/x86/mingw/bin/*.dll)



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

# 链接库文件到可执行文件
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})

参考:

Windows+MinGW使用CMake生成.dll动态链接库_cmake dll_超级小清的博客-CSDN博客

C++-Cmake指令:file【文件操作命令】【比如:file GLOB命令主要用于匹配规则在指定的目录内匹配到所需要的文件】_u013250861的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/weixin_45824067/article/details/130834720