C ++程序上的执行错误:静态可执行文件调用DLL库

时间:2016-01-19 20:36:22

标签: c++ dll static g++

尝试在Windows 8.1中使用-static标志运行使用g ++ 4.8.1编译的C ++程序时出现执行错误。当我编译它时,我使用以下结构:

g++ CPP_FILES H_FILES -std=c++11 -O3 -static -I "C:\...\Path_to_include_directory" -L "C:\...\Path_to_library_directory -l library -o PROGRAM.exe

由于我想要静态编译,因此库名称为libgsl_dll_d(而它的真实姓名是 libgsl_dll_d.lib )。

没有编译错误,然后执行中断。消息错误表示 libgsl_d.dll 不在系统中。为什么那条消息?我没有调用那个库,顺便说一下,它不应该是静态编译的?可执行文件中应该没有依赖项。

我必须说在Linux Ubuntu 14.04中编译和运行该软件时,我根本没有任何错误。

有什么想法吗?我知道静态可执行文件调用动态库是不可能的。为什么会出错?怎么解决?

1 个答案:

答案 0 :(得分:2)

-static将使链接器更喜欢静态库而不是动态库。但它不会将DLL转换为静态库。通常情况下,当您同时拥有同一个库的静态和动态版本时,它就会被使用。

您的文件libgsl_dll_d.lib看起来像是DLL导入库。 DLL导入库的目的是允许DLL像静态库一样使用。它不是DLL的静态版本。因此,当您与它链接时,它最终会使用DLL,这并不奇怪!