所以,我有一个makefile项目,它有一个巨大的目标文件列表,需要编译。
我在Win32上遇到了问题,因为输入字符串太大了。我发现,不是将文件1-by-1传递给链接器,而是通过将@filename
传递给链接器来读取要从文件链接的目标文件。
在我的makefile中:是否有一种方法如何从文件中读取依赖项?这样的事情:
main.lib: @dependency_file_name
其中dependency_file_name
包含创建lib所需的.obj
文件列表。
请记住,将文件内容放入变量也不起作用,因为当使用依赖项列表作为变量时,输入字符串也会出现问题。
另外:该方法应该是可移植的(Linux,Win32)
编辑:目前,我的makefile的结构如下:
# slurp in some global settings
include /path/to/global/settings
all: prepare_target mylib cleanup_target
prepare_target:
# do preparing work (setup temp files etc)
cleanup_target:
# do cleanup work (delete temp files etc)
mylib: \
file1.obj \
file2.obj \
... \
file215.obj
# this file holds the dependencies for each .obj file
include file_with_obj_file_dependencies
实际上有215个C文件要编译到这个库中。正如我所说:当将此列表提供给链接器时,我需要通过文件来完成,因为字符串对于命令行来说太大了。
我可以随意更改makefile中所需的内容:它是从VisualStudio vcxproj生成的,我拥有生成模板。
file_with_obj_dependencies
看起来像这样:
file1.obj: \
file1.c \
file1.h \
file2.obj: \
file2.c \
file2.h \
... \
file215.obj \
file215.c \
file215.h \
答案 0 :(得分:0)
在Windows上,我倾向于使用cygwin。这是我发现的最接近unix的环境。这使您的Makefile可移植。我没有遇到任何限制命令行长度限制。以下是超过3/4的命令行参数的示例:
a := 1 2 3 4 5 6 7 8 9 a b c d e f
.PHONY: test
test:
@echo $(foreach A,$a,$(foreach B,$a,$(foreach C,$a,$(foreach D,$a,$(foreach E,$a,$A$B$C$D$E))))) | wc -wc
(wc
使您不必等待5,000,000左右的字符滚动。)
因此,对于有限的win32工具,使用bash编写中间的命令行参数文件,然后将其传递给前缀为{{1}的link.exe
(例如) }。
类似的东西:
@
(你确定你需要中间文件吗?215源文件似乎不太繁琐。)