我想从一个简单的链接用法开始来解释我的问题。假设有一个库 z可以编译成共享库 libz.dll(D:/libs/z/shared/libz.dll) 或静态库 libz.a (D:/libs/z/static/libz.a)。
让我想链接它,然后我这样做:
gcc -o main.exe main.o -LD:/libs/z/static -lz
根据this documentation , gcc 会搜索 libz.a,即
archive files whose members are object files
我还可以做到以下几点:
gcc -o main.exe main.o -LD:/libs/z/shared -lz
上面的文档中没有提到-l标志将搜索 lib<name>.so .
如果我的 libz.a 和 libz.dll 在同一个目录中会发生什么?库将如何与程序链接?为什么我需要标志 -Wl,-Bstatic和 -Wl,-Bdynamic如果 -l同时搜索共享库和静态库?
如果我编译共享库发行版,为什么有些开发人员会为相同的模块提供带有 .dll 文件的 .a 文件?
例如,Qt 在 bin 目录中提供 .dll 文件,在 lib 目录中提供 .a 文件。它是同一个库,但分别像共享和静态一样构建吗?或者 .a 文件是某种提供与共享库链接的虚拟库,哪里有真正的库实现?
另一个例子是 Windows 上的 OpenGL 库。为什么每个编译器都必须提供像 MingW 中的 libopengl32.a 这样的静态 OpenGL 库?
.dll.a 和 .la 扩展名的文件有什么用途?
附:这里有很多问题,但我认为每个问题都取决于前一个问题,没有必要将它们分成几个问题。
最佳答案
请看一下ld and WIN32 (cygwin/mingw) .尤其是直接链接到 dll 部分,了解有关 -l 行为的更多信息。 LD 的 Windows 端口上的标志。摘录:
For instance, when ld is called with the argument -lxxx it will attempt to find, in the first directory of its search path,
libxxx.dll.a
xxx.dll.a
libxxx.a
cygxxx.dll (*)
libxxx.dll
xxx.dll
before moving on to the next directory in the search path.
(*) Actually, this is not
cygxxx.dllbut in fact is<prefix>xxx.dll, where<prefix>is set by the ld option-dll-search-prefix=<prefix>. In the case of cygwin, the standard gcc spec file includes-dll-search-prefix=cyg, so in effect we actually search forcygxxx.dll.
注意:如果您曾经使用 MinGW 构建过 Boost,您可能还记得 Boost 库的命名完全符合上面链接中描述的模式。
过去在 MinGW 中存在直接链接到 *.dll 的问题,所以建议创建一个静态库lib*.a从 *.dll 导出符号并链接到它。这个 MinGW wiki 页面的链接现在已经失效了,所以我认为直接链接到 *.dll 应该没问题。现在。此外,我用最新的 MinGW-w64 发行版自己做了几次,但都没有问题。
您需要链接标志 -Wl,-Bstatic和 -Wl,-Bdynamic因为有时您想强制静态链接,例如,当搜索路径中也存在同名的动态库时:
gcc object1.o object2.o -lMyLib2 -Wl,-Bstatic -lMyLib1 -Wl,-Bdynamic -o output
上面的代码片段保证了 -l 的默认链接优先级MyLib1 的标志被覆盖,即即使 MyLib1.dll存在于搜索路径中,LD 将选择 libMyLib1.a链接反对。请注意,对于 MyLib2 LD 将再次偏爱动态版本。
注意:如果 MyLib2取决于 MyLib1 ,然后 MyLib1也是动态链接的,不管 -Wl,-Bstatic (即在这种情况下它被忽略)。为了防止这种情况,您必须链接 MyLib2也是静态的。
关于c++ - 与 MinGW 的静态和动态/共享链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15852677/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
我正在尝试用Prawn生成PDF。在我的PDF模板中,我有带单元格的表格。在其中一个单元格中,我有一个电子邮件地址:cell_email=pdf.make_cell(:content=>booking.user_email,:border_width=>0)我想让电子邮件链接到“mailto”链接。我知道我可以这样链接:pdf.formatted_text([{:text=>booking.user_email,:link=>"mailto:#{booking.user_email}"}])但是将这两行组合起来(将格式化文本作为内容)不起作用:cell_email=pdf.make_c
如何将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%}定义的变量,我
有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
在许多ruby类之间共享记录器实例的最佳(正确)方法是什么?现在我只是将记录器创建为全局$logger=Logger.new变量,但我觉得有更好的方法可以在不使用全局变量的情况下执行此操作。如果我有以下内容:moduleFooclassAclassBclassC...classZend在所有类之间共享记录器实例的最佳方式是什么?我是以某种方式在Foo模块中声明/创建记录器还是只是使用全局$logger没问题? 最佳答案 在模块中添加常量:moduleFooLogger=Logger.newclassAclassBclassC..