当您使用 cc(1) 链接程序时,它将调用默认的链接器命令。例如,您的编译器版本可能已构建为在类 unix 平台上默认使用/usr/bin/ld。
有没有办法指定cc(1)(或c++(1))应该使用的不同链接器命令(例如,/usr/local/bin/ld 而不是 /usr/bin/ld)?我主要对 gcc 和 clang 感兴趣。
我不是在寻找涉及单独运行各种编译步骤(例如,预处理、编译、汇编、链接)的方法。
例如,我希望这样的东西可以完成这项工作:
env LD=/usr/local/bin/ld cc foo.c -o foo
但这对 gcc 或 clang 不起作用。当然,如果您有一个首先构建目标文件的 makefile,然后调用 ${LD} 进行链接(例如,env LD=/usr/local/bin/ld make),它会起作用
更新(有一个可能的动机):使用与默认链接器不同的链接器轻松测试。例如,如果能够这样做就好了:
cc --linker=/usr/local/bin/ld foo.c -o foo
相反,您必须生成目标文件,运行 cc -v 找出 ld 的参数,手动运行 ld 你想要那些论点:
cc -c foo.c
cc -v foo.c -o /dev/null
现在查看链接器调用并手动复制/粘贴替换链接器和临时目标文件。像这样的东西(取自 fedora 23 测试的示例),您将 /usr/libexec/gcc/x86_64-redhat-linux/5.3.1/collect2 替换为 /usr/local/bin/ld(尽管它与collect2不完全相同):
/usr/local/bin/ld -plugin /usr/libexec/gcc/x86_64-redhat-linux/5.3.1/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/lto-wrapper -plugin-opt=-fresolution=/tmp/jhein/ccM2XKIg.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o c /usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/5.3.1/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/5.3.1 -L/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../.. c.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/5.3.1/crtend.o /usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../../lib64/crtn.o
如您所见,这并不容易。请注意,在 gcc 信息页面中有关于 collect2 如何查找链接器程序的文档。但根据这些文档,它首先看起来不是环境变量或您可以在命令行上指定的内容(例如,--linker)。文档说它看起来首先是“硬编码链接器文件名”。如果该文档是正确的,要强制它不使用该链接器(即欺骗它),您必须重命名默认链接器(例如,sudo mv/usr/bin/ld/usr/bin/ld. tmp-禁用).
更新 2:使用 -B 似乎足以满足我的需求。请参阅下面我发布答案的位置。我不能接受我自己的回答,但如果可以的话我会接受 - 它似乎很好地解决了这个问题。
最佳答案
-B 选项允许您为编译器将使用的可执行文件、库、包含文件和数据文件指定备用搜索路径。这适用于某些版本的 gcc [1] 和 clang(目前未记录 - 在至少 clang 3.7 和 3.8 的手册页中):
cc -B/usr/local/bin foo.c -o foo
请注意,这将导致 cc 在 -B 指定的路径中搜索其他工具(例如,汇编器)。因此,假设您在/usr/local/bin 中安装了不同版本的 binutils,如果您仅想使用该链接器(而不是 /usr/local/bin/as, et. al.),你可以这样做:
mkdir /tmp/usemyld
ln -s /usr/local/bin/ld /tmp/usemyld
cc -B/tmp/usemyld foo.c -o foo
-B 有自己的一组规则,允许您覆盖 gcc 编译器尝试使用的不同文件(程序、库、包含文件、数据文件)。这至少可以追溯到 gcc 2.95 - 阅读 gcc 手册/信息页。我不知道 -B 的行为与 clang 的兼容性如何。如前所述,clang 手册页中目前没有记录。但它运行良好,让我可以选择如上所示的备用链接器。
gcc 还支持调用 -wrapper 指定的脚本/程序。 clang 没有(目前)。您也可以使用它并指向一个包装器脚本,该脚本会改变编译器正在调用的程序。我不知道 collect2 是否注意 -wrapper 选项(对于 gcc,collect2 是调用至少在编译 c/c++ 程序时链接器)。
[1] collect2 的 gcc 信息页中记录的链接器搜索顺序表示,如果配置了 GCC,它将首先搜索“硬编码链接器文件名”使用 '--with-ld' 选项”)。所以如果你的 gcc 没有配置 '--with-ld',那么它最终会在 -B 指定的路径中搜索(如果它没有找到 real-ld第一)。如果您的 gcc 是配置了 --with-ld,则 -B 选项不会帮助您指定您选择的替代链接器。
关于c++ - 与 'cc' 链接时如何指定备用链接器命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40470931/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/