以下是小可关于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
请按任意键继续. . .