CMake自动导出dll导出符号

CMake自动导出dll导出符号

对于Liunx和Unix平台,默认的c++模块都是以导出形式存在的,windows平台的导出需要声明__declspec(dlexport)进行导出,使用

__declspec(dllimport)进行导入,如果有一个静态库,现在想改成动态库,必须手动添加导出标志,除此,还有一个方法就是将导出信息,写入到*.def文件中,设置到编译器中。但这样都比较麻烦,正好CMake提供了自动生成def文件的功能。

1. 准备基础CMakeLists.txt和c++源文件:

1.1 c++源文件

1.1.1 DLL源码头文件

#include <string>
class comm
{
public:
	static float sqrt(float v);
	float getValue();
	void setValue(float v);
private:
	float m_val;
};

std::string GetSystemName();

1.1.2 DLL源码cpp实现

#include "comm.h"
float comm::s_val = 3.14f;
float comm::sqrt(float v)
{
	return v * v;
}

float comm::getValue()
{
	return m_val;
}

void comm::setValue(float v)
{
	m_val = v;
}

std::string GetSystemName()
{
	static std::string info = "windows 10";
	return info;
}

以上代码不手工添加导出,直接在CMake中设置全部导出便可导出

1.1.2 main.cpp

#include <iostream>
#include "comm.h"

int main()
{
	std::cout <<" app start!"<< std::endl;
	std::cout <<"sqrt(100.0f):"<< comm::sqrt(100.0f)<<std::endl;
	std::cout << "current system info:" <<GetSystemName()<<std::endl;
	
	comm c;
	c.setValue(102.0f);
	std::cout << "c.getValue:" << c.getValue() << std::endl;

	return 0;
}

1.2 CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(CMake_dyanmic_dll_test VERSION 1.0.0 LANGUAGES C CXX)

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
set(BUILD_SHARED_LIBS ON)

add_library(comm comm.h comm.cpp)
add_executable(app main.cpp)
target_link_libraries(app comm)

编译以上代码可以自动导出dll中的类,但对于全局的static函数是无法导出的,对于extern 或static变量,需要添加格外的导出,如下:

class comm
{
public:
	static float sqrt(float v);
	float getValue();
	void setValue(float v);
private:
	
	float m_val;
public:
	COMM_API static float s_val;
};
COMM_API extern const float s_cval;
std::string GetSystemName();

// 静态函数不能被dll导出
// static int GetSystemNum();

reference:

code:
https://github.com/longlongwaytogo/Learning.test/tree/master/cmake/cmake_auto_export
https://www.kitware.com//create-dlls-on-windows-without-declspec-using-new-cmake-export-all-feature/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C动态库导出类的具体步骤如下所示: 1. 首先需要定义一个虚类(InterfaceClass),该类包含需要导出的函数,并且需要将该类定义前面增加API,即__declspec(dllexport)。该类的定义中推荐导出C的基础数据类型,而不是标准库或标准模板库的数据类型,以避免不同版本的库可能引发的问题。在该虚类中,使用纯虚函数的原因是为了实现接口的多态性。 2. 接着,定义实际继承自虚类的类(readImg),即我们原本需要导出的类。该类需要实现虚类中的纯虚函数。 3. 在动态库的源文件中,通过使用C语言的方式导出动态库,并提供一个函数(getInstance),该函数用于获取对应类的对象。在该函数中,通过new关键字创建实际继承类的对象,并返回指向该对象的指针。 4. 最后,在项目属性中,将配置类型设置为dll,以将项目编译为动态库。 综上所述,以上是C动态库导出类的基本步骤。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【cmake实战十】c++从动态库(dll导出类](https://blog.csdn.net/junxuezheng/article/details/126908851)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [c++导出动态库](https://blog.csdn.net/weixin_42295969/article/details/126983694)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值