尝试在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中编译和运行该软件时,我根本没有任何错误。
有什么想法吗?我知道静态可执行文件调用动态库是不可能的。为什么会出错?怎么解决?
答案 0 :(得分:2)
-static
将使链接器更喜欢静态库而不是动态库。但它不会将DLL转换为静态库。通常情况下,当您同时拥有同一个库的静态和动态版本时,它就会被使用。
您的文件libgsl_dll_d.lib
看起来像是DLL导入库。 DLL导入库的目的是允许DLL像静态库一样使用。它不是DLL的静态版本。因此,当您与它链接时,它最终会使用DLL,这并不奇怪!