我在 Visual Studio 解决方案中有两个项目。一个构建静态 LIB,另一个构建动态 DLL。两者都使用静态运行时链接(/MT 和/MTd),并且都使用 Boost。 Boost 不是我的决定 - 我想放弃它,但我被委员会否决了。
LIB 构建良好,但 DLL 从 auto_link.hpp(第 354 行)中发出错误:“将 dll boost 库与静态运行时混合是一个非常糟糕的主意......”。
#if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK)
# define BOOST_LIB_PREFIX
#elif defined(BOOST_DYN_LINK)
# error "Mixing a dll boost library with a static runtime is a really bad idea..."
#else
# define BOOST_LIB_PREFIX "lib"
#endif
我没有定义 BOOST_DYN_LINK。似乎 Boost 正在取得飞跃,因为我正在构建一个 DLL(定义了 _USRDLL 和 _WINDLL),我必须想要动态运行时链接(/MD 或/MDd,它定义了 _DLL)或针对 Boost 的 DLL 链接。这是不正确的,因为我特别要求静态链接(/MT 或/MTd)。
我提交了一份 bug report反对 Boost 的错误假设,但这对我使用该库没有帮助。在报告中,Boost 维护者坚持认为是我设置的(尽管审计显示我不是;并且 Boost 在至少 30 个文件中对其进行了操作)。我找到了 one answer在 Boost 邮件列表上,它基本上声明要更改我的项目设置以适应 Boost。
更改为动态运行时链接(/MD 和/MDd)是不可行的,因为选择静态链接 (1) 出于安全考虑,以及 (2) 另一个库使用静态链接。这是没有商量余地的——我们别无选择。
为清楚起见总结一下(TLDR):我想对所有内容使用静态链接,而我的输出程序是一个 DLL(不是静态 LIB,也不是 EXE)。一切都在 DLL 中静态链接。
有谁知道如何在 Windows 上使用这个库来构建带有静态链接的 DLL?
最佳答案
简短版本:听听 Boost ML 上的人。 Boost 不支持你正在尝试做的事情,无论如何这是一个坏主意。最好接受这一点并让其他库使用动态运行时。
更长的版本:
您似乎误解了 Boost 告诉您的内容。您正在尝试解析 Boost 源代码,而不是仅仅阅读它的内容:
auto_link.hpp (line 354): "Mixing a dll boost library with a static runtime is a really bad idea...".
Boost 认为您正在构建 DLL,同时静态链接到运行时库。这正是你在做什么; Boost 已准确检测到您正在尝试执行的操作。
你的问题是 Boost 库不支持被构建到一个没有动态链接到运行时库的 DLL 中。原因是这是“一个非常糟糕的主意”。因此他们会检查您是否正在尝试这样做,并通过一条错误消息提醒您这一事实来停止您的构建。
Boost 的“freetards”不知道如何让某些东西“开箱即用”,从而阻止了这种情况,因为静态链接到 DLL 中的运行时通常是用户的错误。它要么是意外造成的,要么是由于忽视了这可能造成的主要问题。
如果静态链接到运行时,每个 DLL/exe 都会有自己的运行时拷贝,以及自己的全局变量。由于 heap 是通过全局变量管理的,这意味着每个 DLL/exe 都有自己的堆。因此,如果您尝试释放在另一个地址空间中分配的内存……繁荣。如果您不小心,这比您想象的要容易得多。
这也可能导致其他问题。 “freetards”试图阻止你搬起石头砸自己的脚。但很明显,您比“将他们的废话强加给诚实和毫无戒心的用户”更清楚,他们可能希望在他们即将驶过悬崖时得到建议。
现在,您可以简单地删除错误消息。 Boost 的大部分是 header ,所以只要您实际上没有链接到它的任何 .lib,就应该没问题。但是,我猜想“auto_link.hpp”仅由 Boost 的 .lib 部分使用,很有可能您一开始就遇到它意味着您正在尝试链接到 Boost .lib。
Changing to Dynamic Runtime Linking (/MD and /MDd) is not feasible since static linking was chosen (1) due to security considerations, and (2) another library uses static linking.
如果安全是一个考虑因素,您应该意识到这一点:您正在构建 DLL 这一事实意味着您的应用程序可能对 DLL 注入(inject)开放,无论您如何链接到运行时。所以我看不出动态链接比静态链接安全得多。
关于c++ - "Mixing a dll boost library with a static runtime is a really bad idea...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9527713/
我正在尝试测试是否存在表单。我是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
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas
下面的代码在我第一次运行它时就可以正常工作:require'rubygems'require'spreadsheet'book=Spreadsheet.open'/Users/me/myruby/Mywks.xls'sheet=book.worksheet0row=sheet.row(1)putsrow[1]book.write'/Users/me/myruby/Mywks.xls'当我再次运行它时,我会收到更多消息,例如:/Library/Ruby/Gems/1.8/gems/spreadsheet-0.6.5.9/lib/spreadsheet/excel/reader.rb:11