零、理解动态库、静态库
在完成接口开发后,为了给其他开发人员调用,通常需要将这部分代码打包生成动态链接库文件。
动态链接库很好地保证了代码的封装性和独立性,作为接口,它可以很好地独立于主程序,便于更新。调用接口的主程序编译时也会绕过已生成的动态链接库,仅作连接,在运行时使用它,减少了前端人员编译的时间消耗。
同时由于动态链接库很难被反编译,只有头文件是可见的,这也同时保证了代码的安全性。
在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博客