Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在编译期间包括未使用的代码_C++_Makefile - Fatal编程技术网

C++ 在编译期间包括未使用的代码

C++ 在编译期间包括未使用的代码,c++,makefile,C++,Makefile,从Makefile构建应用程序我发现,从代码中排除一些类及其使用不会影响构建应用程序的大小 // some file // #include "SomeClass.h" ....... void myfunc() { SomeClass _cl; // do something with _cl etc... // _cl.SomeFunc(); ......... } Makefile ...... SOURCES = ... SomeClass.c

从Makefile构建应用程序我发现,从代码中排除一些类及其使用不会影响构建应用程序的大小

// some file
// #include "SomeClass.h"
.......
void myfunc()
{
     SomeClass _cl;
     // do something with _cl etc...
     // _cl.SomeFunc();
     .........
}


Makefile
......
SOURCES = ... SomeClass.cpp .... etc

但若我从Makefile中删除SomeClass.cpp,那个么构建的应用程序的大小就会变小。为什么gcc不优化编译后的代码,也不从最终结果中排除未使用的SomeClass?

您可以通过编译标志进行配置。在linux/gcc上,未使用的符号不会从二进制文件中删除-它们可能会在您打开二进制文件时使用。如果要消除未使用的代码,请将-ffunction节和-fdata节添加到编译选项中,并将--gc节添加到链接器选项中。编译选项将确保每个函数都放在单独的节中(而不是每个文件的节),链接器选项将丢弃未使用的节。

您可以通过编译标志配置此功能。在linux/gcc上,未使用的符号不会从二进制文件中删除-它们可能会在您打开二进制文件时使用。如果要消除未使用的代码,请将-ffunction节和-fdata节添加到编译选项中,并将--gc节添加到链接器选项中。编译选项将确保每个函数都放在单独的节中(而不是每个文件的节),链接器选项将丢弃未使用的节。

您使用的编译器标志是什么?不知道我是否对您的情况有所不同,但请尝试compilerflag
-Os
以优化大小。如果没有lto,gcc无法判断您的类是否从其他编译单元使用。您的应用程序是否静态链接?如果您有动态库,编译器无法判断是否有未使用的内容。谢谢你的建议-lto。我忘了将其包含到我的makefile中,您使用的编译器标志是什么?不知道我是否对您的情况有影响,但请尝试使用compilerflag
-Os
来优化大小。如果没有lto,gcc无法判断您的类是否从其他编译单元使用。您的应用程序是否静态链接?如果您有动态库,编译器无法判断是否有未使用的内容。谢谢你的建议-lto。我忘了把它包括在我的makefile中,