2016-11-21 79 views
0


我来到这里是因为我遇到了一些奇怪的问题。 我有一个代码,加载一个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 ,但我可能是错的。
在此先感谢,并对不起,我的英语:/
祝您有美好的一天!

+0

*如何*和*,其中*你运行该程序“手动”?你在哪个目录?在与DLL相同的目录中?作为可执行文件?既?在不同的目录中? –

+0

我没有任何与您正在使用的库加载DLL的经验。但我建议你多看看“dlopen”标志。也许在Windows API中有一个相当于LOAD_WITH_ALTERED_SEARCH_PATH的值。 – Gonmator

+0

程序二进制文件位于“C:\\ Users \\ Renaud \\。Clion \ system \ cmake \ generated \ Game-225940eb \ Debug”下; 我的dll在同一个目录下。 我跑我的应用程序“手动”上双击该文件,如果我使用的功能_getcwd检索当前 工作目录它告诉我,我在“C:\\ \\用户\\ Renaud的克利翁\ system \ cmake \ generated \ Game-225940eb \ Debug“,这听起来对我很好。 (我得到这个反应太当我通过我的IDE执行我的应用程序) 我会要带我的机会与LoadLibrary来看看它是否工作。 –

回答

0


首先,感谢您的回应!并且很抱歉我没有时间(我没有太多的时间花在这个项目上) 我来到这里是因为我找到了解决方案,我认为这可能对其他人卡在“dll地狱”:对

更改我的‘dllLoader’功能使用Win32 API:

void dllLoader(const char *libPath){ 
    HMODULE handle = LoadLibrary(libPath); 
    if (!handle) { 
     std::cout << "Cannot open library: " << GetLastError() << std::endl; 
    } 
    else{ 
     std::cout << "library loaded" << std::endl; 
     FreeLibrary(handle); 
    } 
} 

如我所料它在第一,如果分支,并且GetLastError返回错误代码127 下降一些搜索后,这个错误代码被检索到了一些情况,因为无法找到库依赖关系。

在的时候,我尝试执行我的克利翁的IDE (手动,通过Windows资源管理器,这是一个简单的“Hello World”,所以没有理由失败)
我得到了一些外部的编译第一个应用程序过去像“...未解析的符号..”这样的错误,编译器不会在链接时链接所有需要的库,所以你的二进制文件 总是依赖于外部库。 我需要把

set(GCC_CXX_FLAGS ${GCC_CXX_FLAGS} "-static-libgcc -static-libstdc++ -static") 

标志进入我的CMake的配置文件来建立我与它的进口所有的依赖二进制文件。

一些测试后,问题在这里一样,我的DLL不具有所有依赖性建成,它依赖和其他一些DLL才能正常运行。 GCC_CXX_FLAGS的更新解决了加载dll但不是dll本身的应用程序的问题。 我不知道它是否存在一个类似的标志来编译使用cmake的库,让链接器在我的DLL中导入所有依赖关系,但我知道我需要搜索。

@Alexey Omelchenko,你点一些有趣的事情在你的评论,我已经中运行的应用程序和oustide我的IDE,只显示PATH环境变量。 唯一的区别是IDE内部PATH为C:\ MingW \ bin文件夹,因此它确认了我在想什么,这是一个依赖关系问题。

再次对不起我的英文和我的回复时间并感谢您的帮助:)
祝您有美好的一天!

相关问题