因此,我试图制作一个可以动态创建dll文件并将其加载到程序中并对其进行调用的程序。 这是我的代码 createFile:
void createFile(std::string data, std::string name) {
std::ofstream file;
name += ".cpp";
file.open(name,std::ofstream::out);
if (file.is_open()) {
file << data;
std::cout << "File saved successfully" << std::endl;
file.close();
}
else {
std::cout << "Error opening file" << std::endl;
exit(1);
}
}
编译:
void compile(std::string name) {
std::string temp;
temp = "c++.exe " + name + ".cpp -o dll/" + name + ".dll -shared -fPIC";
system(temp.c_str());
}
loadFunc:
typedef void (*function)(const char*);
void loadFunc(LPCSTR name, LPCSTR func) {
HMODULE temp;
function __cdecl myproc;
temp = LoadLibraryA(name);
if (temp != NULL) {
std::cout << "\nDll is loaded";
myproc = (function) GetProcAddress(temp, func);
if (myproc !=NULL)
{
std::cout << "\nFunction is loaded\n";
(myproc)("Somthing here");
}
// Free the DLL module.
FreeLibrary(temp);
}
}
问题是,当我使用Visual Studio 2019编译dll时,它工作正常,但如果我使用gcc或c ++或g ++编译dll文件,则不会加载该dll。因此,我尝试使用dependency walker来查看两个dll文件(一个由gcc制作,另一个由visual studio制作)之间的区别。我看到文件结构不同。用gcc制作的dll的大小比使用Visual Studio制作的dll大。有人可以帮我吗?
编辑:
因此,在进行了一些反复试验后,我发现只有具有C库的dll文件才能工作。我不知道为什么我曾尝试过使用iostream,但始终无法加载,而另一方面,当我使用stdio.h时,它运行良好。
dllfile.cpp(带有iostream):
#ifdef __cpluplus
extern "C" {
#endif
#include <iostream>
__declspec(dllexport) void print(const char *x){
std::cout<<x<<std::endl;
}
#ifdef __cplusplus
}
#endif
dllfile.cpp(带有stdio):
#ifdef __cpluplus
extern "C" {
#endif
#include <stdio.h>
__declspec(dllexport) void print(const char *x){
printf("%s",x);
}
#ifdef __cplusplus
}
#endif