我来到这里是因为我遇到了一些奇怪的问题。 我有一个代码,加载一个DLL并从这个DLL检索一个函数。我工作在Windows和Linux上。
所有的东西都像linux中的魅力一样工作,但是当windows来临时,会出现一些问题!
我使用Clion作为IDE,当我编译我的代码并从Clion启动它时,一切正常,我的dll被加载,函数被提取,一切正常。
但是,当我从它的目录启动我的应用程序时,我的应用程序找不到该dll。
这是我的装载机目前的代码(实际上这通常是简单的东西):
手动运行应用程序时无法加载dll,但在通过ide运行应用程序时工作
void dllLoader(const char *libPath){
void* handle = dlopen(libPath, RTLD_LAZY | RTLD_GLOBAL);
if (!handle) {
std::cout << "Cannot open library: " << dlerror() << std::endl;
}
else{
std::cout << "library loaded" << std::endl;
dlclose(handle);
}
}
int main(int argc, char **argv) {
dllLoader("RenderModule.dll");
return 0;
}
,正如我说的,从我的IDE中运行,这是很好的(我得到“库加载的”输出),但当我在目录中运行并手动运行应用程序, 我得到“无法打开库:RenderModule.dll没有这样的文件或目录”输出。
目标dll和二进制文件存储在同一个目录中。
我用CMake 3.3和Mingw来编译这段代码。
奇怪的是,当我检查我的应用程序的运行路径,我尝试读取dll,使用std :: ifstream,我可以正确读取dll!有可能是我没有得到的东西...
我不知道如何解决这个问题,有人有一个想法?
如果你需要DLL的代码,我会编辑这篇文章,但我不认为这是有用的,因为如果这个DLL加载在Linux/Windows(IDE)我认为这个问题不是来自于DLL ,但我可能是错的。
在此先感谢,并对不起,我的英语:/
祝您有美好的一天!
*如何*和*,其中*你运行该程序“手动”?你在哪个目录?在与DLL相同的目录中?作为可执行文件?既?在不同的目录中? –
我没有任何与您正在使用的库加载DLL的经验。但我建议你多看看“dlopen”标志。也许在Windows API中有一个相当于LOAD_WITH_ALTERED_SEARCH_PATH的值。 – Gonmator
程序二进制文件位于“C:\\ Users \\ Renaud \\。Clion \ system \ cmake \ generated \ Game-225940eb \ Debug”下; 我的dll在同一个目录下。 我跑我的应用程序“手动”上双击该文件,如果我使用的功能_getcwd检索当前 工作目录它告诉我,我在“C:\\ \\用户\\ Renaud的克利翁\ system \ cmake \ generated \ Game-225940eb \ Debug“,这听起来对我很好。 (我得到这个反应太当我通过我的IDE执行我的应用程序) 我会要带我的机会与LoadLibrary来看看它是否工作。 –