C++ 中的 __declspec(dllexport) 和 __declspec(dllimport)
__declspec(dllexport) and __declspec(dllimport) in C++
我经常在Windows上看到__declspec(dllexport)
/ __declspec(dllimport)
说明,在Linux上看到__attribute__((visibility("default")))
有功能,但我不知道为什么。你能给我解释一下,为什么我需要对共享库使用这些说明?
Windows-exclusive __declspec(dllexport)
当您需要从 Dll 调用函数(通过导出它)时使用,可以从应用程序访问。
示例 这是一个名为“fun.dll”的 dll :
// Dll.h :
#include <windows.h>
extern "C" {
__declspec(dllexport) int fun(int a); // Function "fun" is the function that will be exported
}
// Dll.cpp :
#include "Dll.h"
int fun(int a){
return a + 1;
}
您现在可以从任何应用程序访问“fun.dll”中的“乐趣”:
#include <windows.h>
typedef int (fun)(int a); // Defining function pointer type
int call_fun(int a){
int result = 0;
HMODULE fundll = LoadLibrary("fun.dll"); // Calling into the dll
if(fundll){
fun* call_fun = (fun*) GetProcAddress(fundll, "fun"); // Getting exported function
if(call_fun){
result = call_fun(a); // Calling the exported fun with function pointer
}
}
return result;
}
我经常在Windows上看到__declspec(dllexport)
/ __declspec(dllimport)
说明,在Linux上看到__attribute__((visibility("default")))
有功能,但我不知道为什么。你能给我解释一下,为什么我需要对共享库使用这些说明?
Windows-exclusive __declspec(dllexport)
当您需要从 Dll 调用函数(通过导出它)时使用,可以从应用程序访问。
示例 这是一个名为“fun.dll”的 dll :
// Dll.h :
#include <windows.h>
extern "C" {
__declspec(dllexport) int fun(int a); // Function "fun" is the function that will be exported
}
// Dll.cpp :
#include "Dll.h"
int fun(int a){
return a + 1;
}
您现在可以从任何应用程序访问“fun.dll”中的“乐趣”:
#include <windows.h>
typedef int (fun)(int a); // Defining function pointer type
int call_fun(int a){
int result = 0;
HMODULE fundll = LoadLibrary("fun.dll"); // Calling into the dll
if(fundll){
fun* call_fun = (fun*) GetProcAddress(fundll, "fun"); // Getting exported function
if(call_fun){
result = call_fun(a); // Calling the exported fun with function pointer
}
}
return result;
}