使文件对预处理器定义敏感
我已经写了一个make文件。
在 make 文件中,我使用了一个变量,比如 EXTRAFLAGS,它看起来像这样。
EXTRAFLAGS += -D _MSC_VER
EXTRAFLAGS += -D BINARYINPUT
EXTRAFLAGS += -D ENABLEVERSION2D2
更远, 我使用编译器标志
CFLAGS = -Werror -Wall -I $(INC) $(EXTRAFLAGS)
并且
mingw32-gcc $(CFLAGS) -o nameofexe OBJ's
使用这个 makefile 没有任何问题。但是,当我禁用预处理器定义时,通过在 EXTRAFLAGS 中的其中一个语句之前引入“#”,然后重新创建它,我将获得最新的目标。我无法将预处理器定义引入敏感列表。
我当前使用的临时解决方法是引入一个虚假目标 clean 并删除所有目标文件并重新编译所有内容。但这是浪费时间。我怎样才能更好地管理当前的情况?
I have written a make file.
In the make file i have used a variable, say EXTRAFLAGS which looks like this.
EXTRAFLAGS += -D _MSC_VER
EXTRAFLAGS += -D BINARYINPUT
EXTRAFLAGS += -D ENABLEVERSION2D2
Further,
I use Compiler flags
CFLAGS = -Werror -Wall -I $(INC) $(EXTRAFLAGS)
and
mingw32-gcc $(CFLAGS) -o nameofexe OBJ's
I have used this makefile with out any problems. But when i disable the preprocessor definitions, by introducing '#' ahead of one of the statments in EXTRAFLAGS, and i remake it, i am getting target up to date. I am unable to introduce Preprocessor Definitions in to the sensitive list.
A temporary work around i am using currently is, introduce a phony target clean and remove all the object files and re compiling every thing. But this is a waste of time. How can i better manage the current scenario?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您尚未使 .o 文件依赖于 makefile 本身内的 Makefile。
当您在 Makefile 中注释输入/输出内容时,您不会更改 .o 文件所依赖的任何内容 - 与编辑 .c 文件时不同,
您可以简单地通过创建 .o 或 .c 的依赖项来解决此问题文件包含 Makefile 本身,当您更新 Makefile 中的任何内容时,所有源代码都将重新编译。
例如;
(现在有更好的方法来生成 .c 和 .o 列表,但以上内容对于本示例来说应该足够了)
You have not made your .o file dependent on the Makefile within the makefile itself.
When you comment things in/out in the Makefile, you don't change anything which the .o file depends on -- unlike when you edit the .c file
You can fix this simply by creating a dependency of your .o or .c file to include the Makefile itself, and when you update anything in your Makefile all your source will recompile.
For example;
(Now there are better ways of generating the .c and .o lists, but the above should suffice for this example)
Make 是一种工具,当项目中的某个文件发生更改时,它可以编译新项目。
例如,当您更改 .h 文件时,它会识别更改并重建所有依赖于它的文件,然后重建所有依赖于新版本的文件,...
但是当您更改编译器标志和/或 makefile 中的定义时项目输入文件不会更改,因此不会重建项目。
有三种方法可以实现您想要的效果: 首先在更改 makefile 后手动发出 make clean。其次,将 makefile 本身包含在您的 makefile 中(并在更改时发出 make clean)。最后将定义移动到某个项目特定的 .h 文件中。
通常,只有“in-ah-file-on-its-own”解决方案是唯一的解决方案,可以避免构建新的所有内容,因为其他解决方案不知道哪些源文件实际上引用了更改的定义。
Make is a tool that compiles your project new when one of your files in the project change.
E.g. when you change your .h file it recognizes the change and rebuilds all files that depend on it, and then rebuild all that depends on the new builds, ...
But when you change the compiler flags and/or the defines in the makefile the project input files do not change, so the project is not rebuild.
There are three ways to achieve what you want: First issue manually a make clean after changing the makefile. Secondly to include the makefile itself in your makefile (and issue there a make clean when it changed). And finally move the defines into some project specific .h file.
Generally only the "in-a-h-file-on-its-own"-solution is the only one, that avoids building everything new, as the others are not aware of which source files actually have a reference to the changed defines.