macos - 果酱 : link command line too long for osx

标签 macos osx-yosemite jam

我正在使用 jamplus 构建供应商的跨平台项目。在 osx 上,C 工具的命令行(通过 clang 提供给 ld)太长。

响应文件是对太长命令行的经典答案:jamplus 在手册中指出可以即时生成它们。

example in the manual看起来像这样:

actions response C++
{
    $(C++) @@(-filelist @($(2)))
}

快到了!如果我专门吹出 C.Link 命令,如下所示:

actions response C.Link
{
    "$(C.LINK)" $(LINKFLAGS) -o $(<[1]:C) -Wl,-filelist,@($(2:TC)) $(NEEDLIBS:TC) $(LINKLIBS:TC))
}

在我的 jamfile 中,我得到了传递到链接器所需的命令行,但响应文件没有换行符终止,因此链接失败(osx ld 需要换行符分隔的条目)。

  1. 有没有办法扩展与换行符连接的 jamplus 列表?我尝试使用连接扩展 $(LIST:TCJ=\n) 但没有成功。 $(LIST:TCJ=@(\n)) 也不起作用。如果我能做到这一点,生成的文件有望是正确的。
  2. 如果没有,我可以使用什么 jamplus 代码来覆盖 clang 的链接命令,并从列表中动态生成内容?我正在寻找侵入性最小的方法来处理这个问题 - 理想情况下,直接修改/覆盖该工具,而不是在需要链接的地方添加新的间接目标 - 因为它是我们供应商的代码库,所以需要尽可能少的编辑。<

最佳答案

您正在寻找的语法是:

newLine = "
" ;

actions response C.Link
{
    "$(C.LINK)" $(LINKFLAGS) -o $(<[1]:C) -Wl,-filelist,@($(2:TCJ=$(newLine))) $(NEEDLIBS:TC) $(LINKLIBS:TC))
}

为了清楚起见(我不确定 StackOverflow 将如何格式化上述内容),应通过键入以下内容来定义 newLine 变量:

newLine = "" ;

然后将克拉放在两个引号之间并按 Enter 键。您可以对某些其他角色使用相同的技术,即

tab = "    " ;

再次,从 newLine = ""开始,然后在引号之间放置克拉并点击 Tab。上面的内容实际上是 4 个空格,这是错误的,但希望您能明白这一点。另一个有用的功能是:

dollar = "$" ;

最后一个很有用,因为 $ 通常用于指定变量,因此当您实际想要指定美元文字时,拥有美元变量非常有用。就其值(value)而言,我正在使用的 Jambase(与我正在使用的 JamPlus 一起提供的 Jambase)具有以下功能:

SPACE = " " ;
TAB = " " ;
NEWLINE = "
" ;

第 28 行附近...

关于macos - 果酱 : link command line too long for osx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27995300/

相关文章:

Javascript - Safari 中是否有 element.scroll 或 element.scrollTo 的替代方案?

tomcat7 - Geoserver 失败 一个或多个监听器无法启动

bjam - 访问 jam 配置文件中的环境变量

macos - 在 Mac 上自动打开和排列应用程序窗口

objective-c - OSX 上的单调时钟

objective-c - 注册一个在程序退出前调用的函数

javascript - NS任务完成情况

无法在 macOS 上使用 GSL 库 - ld : symbol(s) not found for architecture x86_64

Jam 对象规则和目录