生成和链接动态库

生成和链接动态库

  • 在Linux和windows中的动态库是不一样的
    • linux 的动态库不需要设置导入导出符号,以.os为后缀
    • windows中需要设置导入和导出符号.lib,以及动态库的后缀是dll

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)
#endif

SHAREDDLL_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环境下链接动态库时出现的坑

  1. 报错:Process finished with exit code -1073741515 (0xC0000135)

错误原因:缺少dll文件

两种解决方案

  • 手动将dll文件放到build目录下(不推荐),因为如果我们删除build目录后还需要重新添加,很麻烦,容易出错

在这里插入图片描述

  • 为项目添加环境变量,这是我目前最好办法的解决办法,删除build目录后不需要重新手动添加,但是我觉得能在CMakeLists.txt里面解决的话是最好的

复制动态库bin目录的绝对路径(注意,我这里的bin目录是由lib文件的,如果没有lib文件会报错,等下在下面举例报错)

在这里插入图片描述

报错原因:缺少lib文件,即导入文件

在这里插入图片描述
在这里插入图片描述

解决方案就是添加导入文件,也就是我前面说到的

在这里插入图片描述

还有就是刚刚删除shareddll.lib然后撤销的时候报了如下错误,不知道什么原因,但是解决办法也很简单,将撤销得到的删除,重新复制一份即可

在这里插入图片描述

可能是撤销导致文件出错了

ddll.lib`然后撤销的时候报了如下错误,不知道什么原因,但是解决办法也很简单,将撤销得到的删除,重新复制一份即可
在这里插入图片描述

可能是撤销导致文件出错了

在这里插入图片描述

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值