MinGW,如何避免静态链接完整的 libstdc++
MinGW, how to avoid linking statically full libstdc++
我在 cygwin 中使用 mingw 64 位。
我知道如果我使用
编译
x86_64-w64-mingw32-g++.exe -std=c++11 hello.cpp
除非在 Path 环境变量中指定了 libstdc++ 和其他库的库路径,否则输出 .exe 不会 运行。
另一种方法是 link 静态
x86_64-w64-mingw32-g++.exe -std=c++11 hello.cpp -static-libgcc -Wl,-Bstatic -lstdc++ -lpthread
因为我想要一个可以在不同机器上轻松复制的.exe,所以第二种解决方案更适合我。我唯一的问题是,由于我 link 是静态的,即使对于一个简单的 helloworld 程序,可执行文件的大小也会增加到 10 Mb 以上。所以我的问题是:是否可以 link 仅静态地只使用程序实际使用的库部分?
Windows、ld 上的 binutils 链接器不正确支持 --gc-sections 参数,结合编译器标志 -ffunction-sections 和 -fdata-sections,允许链接器抛出移除未使用的代码块。
你真倒霉。您唯一可以做的就是通常的做法:剥离可执行文件(在链接后通过 运行 对其执行剥离命令)并使用 -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
我在 cygwin 中使用 mingw 64 位。
我知道如果我使用
编译x86_64-w64-mingw32-g++.exe -std=c++11 hello.cpp
除非在 Path 环境变量中指定了 libstdc++ 和其他库的库路径,否则输出 .exe 不会 运行。
另一种方法是 link 静态
x86_64-w64-mingw32-g++.exe -std=c++11 hello.cpp -static-libgcc -Wl,-Bstatic -lstdc++ -lpthread
因为我想要一个可以在不同机器上轻松复制的.exe,所以第二种解决方案更适合我。我唯一的问题是,由于我 link 是静态的,即使对于一个简单的 helloworld 程序,可执行文件的大小也会增加到 10 Mb 以上。所以我的问题是:是否可以 link 仅静态地只使用程序实际使用的库部分?
Windows、ld 上的 binutils 链接器不正确支持 --gc-sections 参数,结合编译器标志 -ffunction-sections 和 -fdata-sections,允许链接器抛出移除未使用的代码块。
你真倒霉。您唯一可以做的就是通常的做法:剥离可执行文件(在链接后通过 运行 对其执行剥离命令)并使用 -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