C++ 编译c++;使用g++;和Makefile
当使用由Code::Blocks IDE提供的MinGW的g++(版本4.9.2)时,我得到了难以置信的巨大的.exe文件,对于一个“Hello,World!”程序,文件大小高达1000KB。我使用与从Code::Blocks的“内部”编译完全相同的编译选项(mingw32-g++.exe-Wall-g hello.cpp-o hello.exe,无论如何,我只是从Code::Blocks日志窗口复制它),但与这种方式不同,这种方式为调试目标生成了约70KB的输出,为发布生成了50KB的输出,这会持续生成难以置信的大输出 还有其他人遇到过类似的问题吗 [编辑]我的项目(仅为测试Makefiles而创建)包含两个文件:main.cpp和fun.cpp(无标题)。下面是main.cpp:C++ 编译c++;使用g++;和Makefile,c++,g++,mingw,C++,G++,Mingw,当使用由Code::Blocks IDE提供的MinGW的g++(版本4.9.2)时,我得到了难以置信的巨大的.exe文件,对于一个“Hello,World!”程序,文件大小高达1000KB。我使用与从Code::Blocks的“内部”编译完全相同的编译选项(mingw32-g++.exe-Wall-g hello.cpp-o hello.exe,无论如何,我只是从Code::Blocks日志窗口复制它),但与这种方式不同,这种方式为调试目标生成了约70KB的输出,为发布生成了50KB的输出,这
#include<iostream>
using namespace std;
void fun(void);
int main()
{
cout<<"Hello Make!"<<endl;
fun();
return 0;
}
在Code::Blocks下编译这个“项目”时,我得到了以下信息
使用Makefile时,输出文件的大小为1024KB:
()调试版本通常比优化(也称为“发布”)版本大。尝试将
-O2
或-O3
添加到构建选项中(或-Os
以专门优化大小)
此外,如果在发布版本中不需要调试符号,请删除-g
(或者在以后使用strip
命令删除它们)
还有,;使用链接时间优化编译有时可以减少大小(除了性能改进之外)-为此,请使用-lto
选项(除了其中一个-O
选项)
以上内容将大大减少尺寸
有关选项的更多详细信息,请参阅gcc手册。调试版本通常比优化(也称为“发布”)版本大。尝试将
-O2
或-O3
添加到构建选项中(或-Os
以专门优化大小)
此外,如果在发布版本中不需要调试符号,请删除-g
(或者在以后使用strip
命令删除它们)
还有,;使用链接时间优化编译有时可以减少大小(除了性能改进之外)-为此,请使用-lto
选项(除了其中一个-O
选项)
以上内容将大大减少尺寸
有关选项的更多详细信息,请参阅gcc手册。您是否尝试过使用binutils中的
strip
实用程序?它应该包含在您的工具链中。大型可执行文件是否静态链接到libstdc++?您好,欢迎使用StackOverflow。请花些时间阅读帮助页面,特别是命名和的部分。更重要的是,请阅读。您可能还想了解。您可以使用objdump
查看obj或exe文件中的内容。例如,使用objdump-xhello.exe
,您可以查看exe的各个部分(您可以找到每个部分的大小),使用objdump-dhello.exe
您可以在hello.exe上运行反汇编程序。您尝试过使用binutils中的strip
实用程序吗?它应该包含在您的工具链中。大型可执行文件是否静态链接到libstdc++?您好,欢迎使用StackOverflow。请花些时间阅读帮助页面,特别是命名和的部分。更重要的是,请阅读。您可能还想了解。您可以使用objdump
查看obj或exe文件中的内容。例如,使用objdump-xhello.exe
,您可以查看exe的各个部分(您可以找到每个部分的大小),使用objdump-dhello.exe
您可以在hello.exe.g++选项上运行反汇编程序,即使-Os也没有任何帮助(大小减少了0.5%)。我实际上想弄明白的是,为什么同一个编译器使用相同的选项,相同的优化标志,相同的源文件,从代码的“外部”和“内部”使用::Blocks,会给我不同的结果…@Michal你可能用相同的方式编译它,但你也用相同的方式链接它吗?可能是静态还是动态链接的运行库?我只是从Code::Blocks compile log窗口将以下行复制到我的Makefile(所有目标):mingw32-g++.exe-o main.o foo.o,以确保链接的方式相同。有没有办法知道哪些库是通过gcc静态链接的?@Michal post a,我们可以使用它来尝试复制您的结果。如果您没有收到通知,我只是在下面的回答中发布了它:WG++选项,甚至-Os也没有任何帮助(大小减少了0.5%)。我实际上想弄明白的是,为什么同一个编译器使用相同的选项,相同的优化标志,相同的源文件,从代码的“外部”和“内部”使用::Blocks,会给我不同的结果…@Michal你可能用相同的方式编译它,但你也用相同的方式链接它吗?可能是静态还是动态链接的运行库?我只是从Code::Blocks compile log窗口将以下行复制到我的Makefile(所有目标):mingw32-g++.exe-o main.o foo.o,以确保链接的方式相同。有没有办法知道哪些库是通过gcc静态链接的?@Michal post a,我们可以用它来尝试复制您的结果。如果您没有收到通知,我只是在下面的回答中发布了它
#include<iostream>
using namespace std;
void fun()
{
cout<<"Hello from The Module!"<<endl;
}
CC = mingw32-g++
CFLAGS = -Wall -Os -lto
all: main.o fun.o
${CC} -o hello.exe $^
relink:
mingw32-g++ -o hello.exe hello.o fun.o
main.o: main.cpp
mingw32-g++ ${CFLAGS} -c main.cpp -o $@
fun.o: fun.cpp
mingw32-g++ ${CFLAGS} -c fun.cpp -o $@
clean:
del *.o