C++ 编译c++;使用g++;和Makefile

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的输出,这

当使用由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:

#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