2014-02-28 15 views
0

所以,我已经得到了那个需要编译的对象文件列表,其中有一个巨大的列表。如何从文件读取目标依赖关系?

我已经遇到了Win32上的问题,因为输入字符串太大。我想通过传递@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

在makefile文件,这是否列表中存在的变量? – Beta

+0

@beta:是的,我可以这样做 – eckes

+0

你能告诉我们你怎么做?你必须有一些确定列表的东西。 – Beta

回答

0

在Windows上我倾向于使用cygwin的。这是我发现unix最接近的环境。这使得你的Makefiles可移植。我没有遇到任何限制的命令行长度限制。这里是拥有超过¾一百万的命令行参数的例子:

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编写中间文件命令行参数,然后将其传递给link.exe(比如说),前面加上@

喜欢的东西:

mylib.lib: 
    echo $^ >[email protected] 
    link -o [email protected] @[email protected] 

(你确定你所需要的中间文件215的源文件似乎并不过于繁琐?)