如何判断g ++在哪里可以找到包含文件?基本上如果我
#include <foo.h>
Run Code Online (Sandbox Code Playgroud)
g ++将扫描搜索路径,使用任何include选项添加或更改路径.但是,在几天结束时,有没有办法告诉f ++的绝对路径g ++选择编译?如果在无数的搜索路径中有多个foo.h,则特别相关.
没有一种方法可以实现...有没有办法让g ++告诉我在包括默认值和所有包含选项之后它的最终搜索路径是什么?
我正在寻找一个工具(最好是一个Visual Studio插件),它可以显示给定文件包含的所有文件,并显示这些文件包含的所有文件,依此类推.
一位同事最近向我透露,我们的一个源文件在编译期间包含了超过3,400个标题.我们有超过1,000个翻译单元在构建中进行编译,导致对标题的巨大性能损失,这些标题肯定不会全部使用.
是否有任何静态分析工具可以揭示这样一片森林中的树木,特别是让我们有能力决定我们应该在哪些方面进行削减?
UPDATE
微软在哪里侥幸逃脱
#define small char
您不能只为该语言添加保留字,并将它们静静地包含在平台SDK中!
更重要的是我如何摆脱它!
编辑:如何查找Visual Studio中包含的内容和内容 - 在Visual Studio中显示C++文件的#include层次结构
我们有一个大型Visual Studio 2005 C++/Mfc解决方案,1个项目包含大约1300个源文件(大约650 .h和650 .cpp文件).我们还使用Boost和其他一些库(COM:MSXML,Office).
最近,我添加了一些boost :: multi_index实例来加速一些事情.这一切都在大部分时间汇编.但是现在,当我正在进行完整(发布)重建时,我会在几个模块上遇到编译器崩溃.
Fatal Error C1060: "compiler is out of heap space"
Run Code Online (Sandbox Code Playgroud)
我已经尝试在预编译的头文件中减少包含(删除了除标准MFC头之外的所有内容).另外,我删除了编译器选项/ Zm200(我们在编译预编译头文件之前需要它).
奇怪的是:当我在编译器崩溃后按F7(build)时,构建过程继续没有任何问题(或者至少到下一次编译器崩溃,再次按F7).但是能够在没有任何中断的情况下完成构建将会很棒.
我可以影响各个模块的构建顺序吗?这样,我可以将"有问题"的模块放在流程的开头(并希望崩溃不只是转移到其他模块).
BTW:完整的构建大约需要90分钟.
更新:
谢谢你的回答.我能够摆脱编译器崩溃并显着减少编译时间.这是我做的:
更新2:
上面,我提到"单核机器",实际上是一个较慢的双核机器.
有时使用复杂的头结构会出现一些标题,但很难分辨出来.
是否有一些工具(依赖性查看器?)或方法如何找到"包含堆栈"(哪个源/哪个标题/哪个标题/ ...)包含一个特定的头文件?
如果多次包含头文件,找到第一个包含就足够了,找到所有包含是一个值得欢迎的奖励.
比如说,我想要一个工具(或脚本?)来获取项目(或.h文件)并构建包含在其中的“包含”的可搜索树(包含到包含到等等)。有这样的东西存在吗?我应该自己写这个吗[当然我是:),但可能有人已经写了它或者可能知道如何得到它]?
我们经常会遇到这样的问题,如下所示:
1>Compiling...
1>a.cpp
1>c:\apps\b.h(22) : fatal error C1083: Cannot open include file: 'boost/shared_ptr.hpp': No such file or directory
Run Code Online (Sandbox Code Playgroud)
有时它可能会很乏味,因为在一个大项目中有很多包含文件,甚至嵌套包含文件。
跟踪/哪个包含文件是包含有问题的包含文件的罪魁祸首(父级)的最佳方法是什么?
问题是它有嵌套的包含,所以需要花费一些努力才能知道哪个文件实际包含 bh
我使用Visual Studio 2012,并尝试使静态库UDT正常工作。不幸的是,我无法编译将UDT库链接到其自身的项目,我在Windows SDK标头中遇到有关类型或宏重新定义的159个奇怪的错误。
c:\program files\windows kits\8.0\include\shared\ws2def.h(96): warning C4005: 'AF_IPX' : macro redefinition
2> c:\program files\windows kits\8.0\include\um\winsock.h(452) : see previous definition of 'AF_IPX'
2>c:\program files\windows kits\8.0\include\shared\ws2def.h(136): warning C4005: 'AF_MAX' : macro redefinition
2> c:\program files\windows kits\8.0\include\um\winsock.h(471) : see previous definition of 'AF_MAX'
2>c:\program files\windows kits\8.0\include\shared\ws2def.h(173): warning C4005: 'SO_DONTLINGER' : macro redefinition
2> c:\program files\windows kits\8.0\include\um\winsock.h(394) : see previous definition of 'SO_DONTLINGER'
2>c:\program files\windows kits\8.0\include\shared\ws2def.h(217): error C2011: 'sockaddr' : 'struct' type redefinition
2> c:\program files\windows kits\8.0\include\um\winsock.h(477) : see declaration …
我需要从类中实例化一个对象,比如说Cat,并且知道它包含的文件的名称.
主程序看起来应该是这样的:
#include <iostream>
#include <vector>
#include "Cat.h"
using namespace std;
vector<string> getIncludes(Cat cat){
...
}
int main(int argc, char *argv[])
{
Cat cat;
std::vector<string>list = getIncludes(cat);
}
Run Code Online (Sandbox Code Playgroud)
而Cat类头文件将是这样的:
#include "utils.h"
#include "animals.h"
class Cat{
public:
Cat();
~Cat();
void meow();
private:
int age;
}
Run Code Online (Sandbox Code Playgroud)
打电话后std::vector<string> list = getIncludes(cat),list应该包含"utils.h"和"animals.h".
如果还有另一种方法可以在主函数中获取这些名称,我愿意接受建议.先感谢您.