MinGW,如何避免静态链接libstdc ++

时间:2017-07-29 08:48:44

标签: c++ cygwin static-linking mingw-w64

我正在使用mingw 64位与cygwin。

我知道如果我使用

进行编译
x86_64-w64-mingw32-g++.exe -std=c++11 hello.cpp

除非在Path环境变量中指定了libstdc ++和其他库的库路径,否则输出.exe不会运行。

另一种方法是静态链接

x86_64-w64-mingw32-g++.exe -std=c++11 hello.cpp -static-libgcc -Wl,-Bstatic -lstdc++ -lpthread

由于我想要一个可以在不同机器上轻松复制的单个.exe,第二种解决方案对我来说更好。我唯一的问题是,因为我静态链接,即使是一个简单的helloworld程序,可执行文件的大小也会增加到10 Mb以上。所以我的问题是:是否可以静态链接程序实际使用的库部分?

1 个答案:

答案 0 :(得分:0)

Windows上的binutils链接器ld不能正确支持--gc-sections参数,它与编译器标志-ffunction-sections和-fdata-sections结合使用,允许链接器丢弃未使用代码块。

你好运。你唯一能做的就是通常:剥离可执行文件(通过在链接后运行strip命令)并使用-Os编译优化大小的代码。

请记住,这些选项在Windows上不起作用(出于本答案的目的,包括Cygwin平台),这通常是如何执行此操作的:

g++ -c -Os -ffunction-sections -fdata-sections some_file.cpp -o some_file.o
g++ -c -Os -ffunction-sections -fdata-sections main.cpp -o main.o
g++ -Wl,--gc-sections main.o some_file.p -o my_executable