Eclipse CDT没有在头文件更改上构建项目

时间:2012-03-27 07:06:38

标签: eclipse reference header eclipse-cdt

我有Eclipse Platform 3.7.2和CDT 8.0.2。

当我想要从其他工作区项目执行“Build All”标头时,不会将其视为依赖项,也不会重建任何内容。

我有一个hello world应用程序和一个静态库项目。 静态库在Project Properties中设置为引用 - > c / c ++ general - >路径和符号 - >参考标签 - >选中'有效'。这是我改变的唯一设置。

顺便说一句,它完全胜过我为什么Eclipse在Project Properties下有一个额外的“Project References”顶级项目。

无论如何,我尝试了外部构建器(在项目创建时默认选中)和内部构建器,还结合了全局设置'首选项 - >的组合。 c ++ - >构建 - >仅在Eclipse资源更改时构建配置........'

感谢您对此的任何想法。

更新: 这是构建依赖项目Proj2(Proj1是lib)时的控制台输出。 'make all'被调用,但它只是重新链接,它不会重新编译Main.cpp。 有人熟悉eclipse生成的makefile吗?再次感谢。

**** Build of configuration Debug for project Proj2 ****

make all 
Building target: Proj2
Invoking: Cross G++ Linker
g++ -L"/home/user/.eclipse-workspace/Proj1/Debug" -o "Proj2"  ./Main.o   -lProj1
Finished building target: Proj2


**** Build Finished ****

编辑:这已经有1.5年了,想补充说已经为此提交了一个Eclipse错误: https://bugs.eclipse.org/bugs/show_bug.cgi?id=375800

3 个答案:

答案 0 :(得分:7)

此问题存在错误: https://bugs.eclipse.org/bugs/show_bug.cgi?id=375800

一个工作和整洁的解决方法(orignal请求者已经知道这一点)。所以我只是交换到实际答案:) https://bugs.eclipse.org/bugs/show_bug.cgi?id=375800#c11

KrzysztofCzaińsk的所有学分

在项目c或c ++编译器设置中,在标志后添加-MT ${OUTPUT_PREFIX}${OUTPUT}

${COMMAND} ${FLAGS} -MT ${OUTPUT_PREFIX}${OUTPUT} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}

这将创建正确的.d文件


增加:解决方法有一个副作用。干净的make all总是运行两次之后才会说无事可做。更改后仍然比不编译更好; - )

答案 1 :(得分:1)

最安全的做法是首先“清理”主项目,然后重建。通常,当我知道主项目中的哪些文件使用修改后的头文件时,我只需“触摸”这些文件然后重建。 “触摸”对我来说只是在一行上添加一个空格,通常是文件顶部的#include行之一。然后该文件重建并获取修改后的标头。其他可能使用该标头的文件将无法重建,因此这很危险。例如,如果更改了方法调用的签名并以此方式重建,则只有一个文件将正确调用新方法。从其他源文件调用可能会导致您的程序陷阱。当然的优点是重建速度。特别是在进行单元测试时,我确切地知道我将运行哪些测试,所以我只需触摸相关文件,重建运行。在安全的某些时候,我总是做一个清洁/构建周期。通常我等到我需要更多咖啡。

答案 2 :(得分:0)

只是将其丢弃,但是您是否仍然需要在客户端代码中包含静态库中的标头?在这种情况下,我认为您需要在客户端的项目属性的includes选项卡中添加标头。否则我不确定你将如何实际访问客户端中的静态lib实现。

对于两个references选项卡,我相信C / C ++中的选项卡可以针对不同的配置单独定义,而更通用的选项卡适用于任何配置。

<强>更新
我建议您使用您所评论的更一般的reference标签。这应该确保您的客户端引用其他项目,无论当前选择的客户端配置或项目引用是什么。

另一个更新:
我刚才意识到你提到你改变的唯一设置是references。这是另一个远景,但我还会检查静态库的包含路径是否实际显示在项目设置的包含选项卡中(可能是)。我知道在编译时正在使用正确的包含路径,但是当决定启动客户端项目的重新编译时,eclipse(可能)使用 this 选项卡来确定包含依赖关系。可能值得查看“源位置”选项卡,并尝试将标题位置添加为源位置。

enter image description here