c++之dll动态调用

以下是小可关于c++动态调用的理解有不对之处希望大家指正


配合测试动态库代码

#ifndef DLLDEMO_H
#define DLLDEMO_H

#if defined(WIN32) || defined(_WIN32)
#ifdef MYDLLEXPORT
#define API_DLLEXPORT    extern "C"  __declspec(dllexport)
#else
#define API_DLLEXPORT    extern "C"  __declspec(dllimport)
#endif
#else
#define API_DLLEXPORT    extern "C"  __attribute__((visibility("default")))
#endif

API_DLLEXPORT int sum(int a, int b);

#endif // !DLLDEMO_H
#define MYDLLEXPORT

#include "dlldemo.h"

API_DLLEXPORT int sum(int a, int b)
{
	return (a + b);
}

windows下编译为dlldemo.dll,linux下编译为libdlldemo.so
现在测试库有了就可以写测试代码了。

测试代码

#include <iostream>
#define LOG_VAR(a)   {std::cout  <<(#a)<<": "<< (a)<<"\n";}

#include <string>
#ifdef _WIN32
#include <windows.h>
#else
#include <dlfcn.h>
 // 编译添加 -ldl
#endif


#ifdef _WIN32
#define dlOpen(dll, flag) ::LoadLibraryA(dll);
#define dllGetHandle(handle, symbol) ::GetProcAddress((HMODULE)handle, symbol)
#define dllClose(handle) ::FreeLibrary((HMODULE)handle)
#define dllGetError() (std::to_string(::GetLastError()).c_str())
#else
#define dlOpen(dll, flag) dlopen(dll, flag)
#define dllGetHandle(handle,symbol) dlsym(handle,symbol)
#define dllClose(handle) dlclose(handle)
#define dllGetError() dlerror()
#endif

#include "dlldemo.h"

 typedef int(*mysum)(int, int);

 int main()
 {

#if 0 //是否动态调用
	 int a = 10;
	 int b = 20;
	 int c1 = sum(a, b);
	 LOG_VAR(c1);
#else

#ifdef _WIN32
	 void* handle = dlOpen("dlldemo.dll", 0);
#else
	 void* handle = dlOpen("libdlldemo.so", RTLD_LAZY);
#endif
	 mysum pmysum = (mysum)dllGetHandle(handle, "sum");
	 if (pmysum == nullptr)
	 {
		 LOG_VAR(dllGetError());
		 dllClose(handle);
#ifdef _WIN32
		 system("pause");
#endif // !_WIN32
		 return -1;
	 }

	 int a = 10;
	 int b = 20;
	 int c2 = pmysum(a, b);
	 LOG_VAR(c2);

	 dllClose(handle);
#endif

#ifdef _WIN32
	 system("pause");
#endif // !_WIN32


	 return 0;
 }

结果如下

c2: 30
请按任意键继续. . .
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值