2017-07-29 222 views
0

我正在使用mingw 64位与cygwin。MinGW,如何避免链接静态完整libstdC++

我知道,如果我编译使用

x86_64-w64-mingw32-g++.exe -std=c++11 hello.cpp 

输出.exe文件不运行,除非库路径与libstdC++和其他图书馆是PATH环境变量中指定。

另一种选择是因为我想单个.exe,我可以很容易地在不同的机器复制,第二个解决方案是为我好链接静态

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

。我唯一的问题是,因为我静态链接,即使是一个简单的helloworld程序,可执行文件的大小也会增加到10 Mb以上。所以我的问题是:是否可以静态链接程序实际使用的库部件?

回答

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 
+0

我从来没有执行过这些操作之前。您介意提供更多细节还是示例? - – Hybridslinky