生成和链接动态库
- 在Linux和windows中的动态库是不一样的
- linux 的动态库不需要设置导入导出符号,以
.os
为后缀 - windows中需要设置导入和导出符号
.lib
,以及动态库的后缀是dll
- linux 的动态库不需要设置导入导出符号,以
1、windows环境
1、创建动态库
- 项目结构
- CMakeLists.txt
cmake_minimum_required(VERSION 3.28)
project(shareddll)set(CMAKE_CXX_STANDARD 17)add_library(shareddll SHARED src/library.cpp)
target_compile_definitions(shareddll PRIVATE SHAREDLL_EXPORTS)# 设置安装目录
SET(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}/${PROJECT_NAME}_bin)
#获取全部头文件
file(GLOB HEADERS "include/*.h")
# 拷贝头文件 到 include 目录下
INSTALL(FILES ${HEADERS} DESTINATION include)
# 拷贝动态库 到 lib 目录下
INSTALL(TARGETS shareddll DESTINATION bin)
- library.h
#ifndef SHAREDDLL_LIBRARY_H
#define SHAREDDLL_LIBRARY_H
//在windows环境下,需要设置导入导出符号
#ifdef SHAREDLL_EXPORTS //在编译阶段定义SHAREDLL_EXPORTS,表示导出符号,即生成.lib文件
#define SHAREDDLL_API __declspec(dllexport)
#else //如果是运行阶段,即使用这个库的程序,需要导入符号,即使用.lib文件
#define SHAREDDLL_API __declspec(dllimport)
#endifSHAREDDLL_API void hello();
/*** 如果是类的导入导出,需要在类的定义前加上__declspec(dllexport)或者__declspec(dllimport)* 例如:* class SHAREDDLL_API Test{* public:* void test();*}*/#endif //SHAREDDLL_LIBRARY_H
- library.cpp
#include "../include/library.h"#include <iostream>void hello() {std::cout << "Hello, World!" << std::endl;
}
经过编译以后,会在built的目录下生成相关动态库文件
但是这样很难使用,我们可以安装这个库,让结构更加清晰且易于使用
点击install后,会生成如下文件
2、链接动态库
- 项目结构
- CMakeLists.txt
cmake_minimum_required(VERSION 3.28)
project(sharedTest)set(CMAKE_CXX_STANDARD 17)include_directories(bin/shareddll_bin/include)link_directories(bin/shareddll_bin/bin)# 生成可执行文件
add_executable(sharedTest main.cpp)# 链接动态库
target_link_libraries(sharedTest shareddll)
- main.cpp
#include <iostream>
#include "library.h"
int main() {std::cout << "Hello, World!" << std::endl;hello();return 0;
}
在windows环境下链接动态库时出现的坑
- 报错:
Process finished with exit code -1073741515 (0xC0000135)
错误原因:缺少dll文件
两种解决方案
- 手动将dll文件放到build目录下(不推荐),因为如果我们删除build目录后还需要重新添加,很麻烦,容易出错
- 为项目添加环境变量,这是我目前最好办法的解决办法,删除build目录后不需要重新手动添加,但是我觉得能在CMakeLists.txt里面解决的话是最好的
复制动态库bin目录的
绝对路径
(注意,我这里的bin目录是由lib文件的,如果没有lib文件会报错,等下在下面举例报错)
报错原因:缺少lib文件,即导入文件
解决方案就是添加导入文件,也就是我前面说到的
还有就是刚刚删除shareddll.lib
然后撤销的时候报了如下错误,不知道什么原因,但是解决办法也很简单,将撤销得到的删除,重新复制一份即可
可能是撤销导致文件出错了
ddll.lib`然后撤销的时候报了如下错误,不知道什么原因,但是解决办法也很简单,将撤销得到的删除,重新复制一份即可
可能是撤销导致文件出错了