将索引宏传递给已编译的模块
Posted
技术标签:
【中文标题】将索引宏传递给已编译的模块【英文标题】:Passing an index macro to compiled modules 【发布时间】:2015-03-28 23:18:00 【问题描述】:我使用 makefile 编译我的项目,该文件的表达式为
g++ -c a.cpp b.cpp c.cpp
有没有简单的方法来定义一个会增加每个文件的宏? (例如 a 0、b 1、c 2)
不用说,但项目由无数文件组成,并且数量会发生变化,因此硬编码任何内容都是不可能的。
【问题讨论】:
“增加每个文件”是什么意思?您是否需要一个计数器来计算您传递的文件,或者一种从“a.cpp”开始并自动以“z.cpp”结尾的方法,或者其他什么? 另外,命令g++ a.cpp b.cpp c.cpp
不是有效的编译器命令。如果您需要帮助,请具体说明:您真正运行什么?如果您确实对所有源文件调用了单个编译器调用,那么 make 将无法帮助您计算它们,因为 make 调用一个命令来构建它们;它怎么能算什么?
好吧,我实际上运行 g++ -C (files),它编译源文件但不链接它们。关键是要有一个整数宏,它对于每个目标文件都是唯一的。
这个宏必须适用于您传递给它的任何个文件名,还是可以限制为文件名列表?
它必须适用于任何文件名列表。虽然我用一些 makefile 黑魔法解决了
【参考方案1】:
目前还不太清楚您要做什么,但应该可以用 bash 命令代替:
%.c:
@#do nothing
all: depA.c depB.c depC.c
echo `i=0; for f in $^; do echo $$f; echo $$i; i=$$((i+1)); done`
会输出
echo `i=0; for f in depA.c depB.c depC.c; do echo $f; echo $i; i=$((i+1)); done`
depA.c 0 depB.c 1 depC.c 2
如果您正在处理变量列表,当然可以将 $^
替换为另一个变量。
约翰
【讨论】:
以上是关于将索引宏传递给已编译的模块的主要内容,如果未能解决你的问题,请参考以下文章