作为引用,我使用的是 MinGW (GCC 5.3)。使用
编译文件时g++ file.cc -static-libstdc++
它静态链接 C++ 标准库 (libstdc++) 并生成 1.9MB 的可执行文件。
无论如何运行
gcc -lstdc++ -static-libstdc++ file.cc
它仍然动态链接到 libstdc++-6.dll 并生成一个 34KB 的可执行文件。
为什么 -static-libstdc++ 仅适用于 g++ 而不适用于纯 gcc?
最佳答案
-static-libstdc++
When the g++ program is used to link a C++ program, it normally automatically links against libstdc++. If libstdc++ is available as a shared library, and the -static option is not used, then this links against the shared version of libstdc++. That is normally fine. However, it is sometimes useful to freeze the version of libstdc++ used by the program without going all the way to a fully static link. The -static-libstdc++ option directs the g++ driver to link libstdc++ statically, without necessarily linking other libraries statically.
这清楚地表明选项 -static-libstdc++只对
g++编译器驱动程序,不是 gcc或任何其他。
另一方面,选项-l<name>是有意义的,意思是一样的
到所有 GCC 编译器驱动程序。在此基础上,以下情况不足为奇:
gcc file.cc -lstdc++ -static-libstdc++
与以下含义相同:
gcc file.cc -lstdc++
但是,这种观察并没有真正说明为什么第一个
命令行动态链接 libstdc++ :-
-static-libstdc++仅对 g++ 有意义因为只有 g++链接
libstdc++自动地。所以它只适用于 g++问题出现了
是否自动链接libstdc++将是动态版本
或静态版本。动态版本是默认的:-static-libstdc++
坚持静态版本。
自动链接 libstdc++通过 g++意思是:g++默默
附加 -lstdc++ 您指定的任何链接选项(连同
很多其他用于 C++ 链接的样板)。你可以揭示所有
通过请求详细链接(g++ ... -Wl,-v ...)的样板。
就其本身而言,附加的 -lstdc++将导致链接器链接动态版本
的 libstdc++ ,根据其默认行为。唯一不同的是
-static-libstdc++是在-lstdc++的地方吗?否则会
被默默地传递给链接器,选项:
-Bstatic -lstdc++ -Bdynamic
而是默默地传递给它。这些告诉链接器:
-Bstatic : 在另行通知之前不要链接动态库-lstdc++ : 链接 libstdc++ -Bdynamic :链接动态库,直至另行通知。您会看到它是如何保护 libstdc++ 的静态链接的没有
对任何其他库的链接产生副作用。
但是你也可以看到libstdc++的自动联动, 无论
动态或静态,对链接没有追溯影响
您自己指定的任何库。
因此,如果您的链接已经包含 -lstdc++在任何样板之前
选项由编译器驱动程序静默附加,然后是 libstdc++将被链接
与任何 -l<name> 一样在链接中的那个位置
顺序。如果默默地附加样板选项导致 -lstdc++
在链式序列的后期重新出现,无论是单独出现还是与
周边环境:
-Bstatic -lstdc++ -Bdynamic
那么后面的出现将是多余的,因为图书馆有 已经关联。
所以 gcc 没有什么特别之处结果是:
gcc file.cc -lstdc++ -static-libstdc++
生成一个程序,其中 libstdc++ 动态链接。也是如此
g++ file.cc -lstdc++ -static-libstdc++
或者确实是:
g++ file.cc -static-libstdc++ -lstdc++
因为生成的链接器命令行的形式是:
... file.o -lstdc++ ... -Bstatic -lstdc++ -Bdynamic ...
哪里-Bstatic -lstdc++ -Bdynamic为时已晚,无法产生任何影响。
检查一下:
文件.cc
#include <iostream>
int main()
{
std::cout << "Hello World" << std::endl;
return 0;
}
正常编译链接并检查动态依赖ldd :
$ g++ -o prog file.cc
$ ldd prog
linux-vdso.so.1 => (0x00007ffede76a000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f42fa74c000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f42fa385000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f42fa07c000)
/lib64/ld-linux-x86-64.so.2 (0x0000558ab42bc000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f42f9e65000)
libstdc++.so存在。
现在只需要 -static-libstdc++ :
$ g++ -o prog file.cc -static-libstdc++
$ ldd prog
linux-vdso.so.1 => (0x00007fff448d7000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fe5f7c71000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe5f78aa000)
/lib64/ld-linux-x86-64.so.2 (0x0000556ebf272000)
libstdc++.so不存在。
最后是 -static-libstdc++ -lstdc++ :
$ g++ -o prog file.cc -static-libstdc++ -lstdc++
$ ldd prog
linux-vdso.so.1 => (0x00007ffd12de9000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fd5a1823000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd5a145c000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd5a1153000)
/lib64/ld-linux-x86-64.so.2 (0x000055bbe31c3000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd5a0f3c000)
libstdc++.so回来了。
(当然,这是 Linux,但您会在 Windows 上找到同样的东西)。
所以你是否驱动你与g++的联动?或 gcc , 原因是
{gcc|g++} file.cc -lstdc++ ...
将导致 libstdc++动态链接就是这样
{gcc|g++} file.cc -lfoo ...
会导致libfoo动态链接,如果可以的话,不管
什么...是,前提是 ...不包含选项 -static .
关于c++ - -static-libstdc++ 适用于 g++ 但不适用于纯 gcc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44488972/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我正在使用带有Rails的Devise,我想添加一个方法“getAllComments”,所以我这样写:classUser在我的Controller中:defdashboard@user=current_user@comments=@user.getAllComments();end当我访问我的url时,我得到了undefinedmethod`getAllComments'for#我做错了什么?谢谢 最佳答案 因为getAllComments是一个类方法,而您正试图将其作为实例方法访问。您要么需要访问它:User.getAllCom
我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试