【发布时间】:2013-03-06 08:17:55
【问题描述】:
就像others 我有一个超过 Windows cmd 行限制的链接行。对于大多数情况,我们通过使用目标文件的子集构建中间档案(又名静态库)并执行与这些档案的最终链接来解决问题。但是,在 Google Test 中使用此策略会导致无法找到测试,特别是在已归档的目标文件中定义的测试。
更新:This is why。我可能会使用这种解决方法,但我仍然想了解如何使响应文件在 scons 下工作。
LongCmdLinesOnWin32 修复存在问题。我们有一个 cygwin 环境和包含空格的路径名,因此一些编译器绝对路径包含引号。 LongCmdLinesOnWin32 中的脚本首先需要扩展以处理嵌入的引号和空格(否则它会创建单个路径名的单独标记)。更严重的是,在使用 MS Visual Studio 时,编译器命令只是“cl”,即不包括路径名。这在 PATH 环境中不可用 - 它似乎是动态设置的(以某种方式)并且在构造 LongCmdLinesOnWin32 脚本的 cmdline 参数时不可见。但我离题了....
似乎有一个更简单(在我看来也很合适)的解决方案:response files,这也是supported by gcc。
我写了一个小函数来获取对象名称列表并将它们打印到一个文本文件中,一个到一行,类似于:
"""
In place for generating response files
"""
def gen_response_file(filename,file_list):
with open(filename,"w") as f:
for obj_name in file_list:
f.write ('%s\n' %os.path.abspath(str(obj_name)).replace('\\','/'))
return filename
然后我尝试在文件名前添加“@”字符并将其添加到选项列表中。
回显的命令行是:
link /nologo /MACHINE:x86 /DEBUG @E:\dev\pcoip_view_client\soft_test.rsp /OUT:blah_client\blah_client_tests.exe /LIBPATH:\\sterbkp03\qt\4.8.2\lib ....
如果我只是将文件命名为“soft_test”,那么 scons 会添加后缀“.obj”而链接器找不到它,所以我尝试添加后缀“.rsp”。现在,链接器抱怨它找不到文件,但它存在。我捕获了 scons 的输出并将其粘贴到 bat 文件中。当我运行 bat 文件(来自 VS 2008 命令行环境)时,链接就像一个魅力,所以看起来 scons 以某种方式导致了查找文件的问题
我尝试更改路径,使用绝对 (@C:\blah\soft_test.rsp)、相对 (@.\soft_test.rsp) 和只是 @soft_test.rsp,它们都不起作用。
LINK : fatal error LNK1104: cannot open file '@E:\dev\swift.dev\blah_client\soft_test.rsp'
scons: *** [blah_client\blah_client_tests.exe] Error 1104
我在 Windows 7-64 下使用 scons v2.1.0.r5357、VS 2008 和 python 2.7
我的 scons 文件如下所示:
test_objects = tenv.Object(test_sources)
xx = gen_response_file('soft_test.rsp',test_objects)
tenv.Append( LINKFLAGS = [ '@%s' % os.path.abspath(xx)]) #
test_exe = tenv.Program(target = 'blah_client_tests', source = objects + moc_objects + qrc_objects )
非常感谢任何建议。
更新:我用 gcc 试过了,没有问题。我的猜测是,与 Visual Studio 工具相关的 scons 规则以某种方式不同,足以引起悲伤。
【问题讨论】:
-
能否提供 SCons 的完整输出。
-
嗯,它很大,我认为它并没有比我上面给出的 sn-p 提供更多信息——只是有一长串对象名称。
标签: windows linker scons googletest