我对 VS2010 和 VS2012 之间编译库的二进制兼容性感到困惑。我想迁移到 VS2012,但是许多闭源二进制 SDK 仅适用于 VS2010,例如用于连接硬件设备的 SDK。
传统上,据我所知,Visual Studio 对编译器版本非常挑剔,在 VS2010 中,您无法链接到为 VS2008 编译的库。
我现在感到困惑的原因是,我正在迁移到 VS2012,我已经尝试了几个项目,令我最惊讶的是,他们中的许多人都可以毫无问题地跨版本工作。
注意:我不是在谈论 v100 模式,据我所知,它只是 VS2010 编译引擎之上的 VS2012 GUI。
我说的是在 VS2012 中打开一个 VS2010 的解决方案,点击更新,看看会发生什么。
当链接到一些更大的库时,比如 boost,编译没有工作,因为有编译器版本检查,它们会引发错误并中止编译。其他一些库只是在缺少函数时中止。这是我所期望的行为。
另一方面,许多库工作正常,没有错误或额外警告。
这怎么可能? VS2012 是否以特殊方式制作以保持与 VS2010 库的二进制兼容性?它取决于动态链接还是静态链接?
最重要的问题是:即使在编译时没有出现错误,我能否相信编译器在将 VS2012 项目链接到 VS2010 编译库时不会出现任何错误?
最佳答案
“许 multimap 书馆运作良好。怎么可能?”
1) 库被编译为使用静态 RTL,因此代码不会引入第二个冲突的 RTL DLL。
2) 代码只调用完全在头文件中的函数(并使用结构等) 所以不会导致链接器错误,或者 调用新 RTL 中仍然存在的函数,因此不会导致链接器错误,
3) 不会调用任何具有已更改布局或含义的结构,因此它不会崩溃。
#3 是需要担心的问题。您可以使用导入来查看它使用的内容并制作完整列表,但没有文档或保证哪些兼容。仅仅因为它似乎运行并不意味着它没有潜在的错误。
还有可能
4) 编写了驱动程序 SDK 或其他相当低级别的代码,以避免完全使用标准库调用。
另外(我认为不是您的情况)DLL 可以被隔离并拥有自己的 RTL,并且不会在不同机制之间来回传递内容(例如内存分配和释放)。进程内 COM 服务器以这种方式工作。如果您注意传递和返回的内容以及对指针之类的操作,DLL 通常可以执行此操作。例如,Crypto++ 是用封闭程序中的内存例程初始化的,并且不会从它编译时使用的 RTL 版本中公开 malloc 的内存。
关于c++ - VS2010 和 VS2012 之间的二进制 C++ 库兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18283569/
在railstutorial中,作者为什么选择使用这个(代码list10.25):http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-usersnamespace:dbdodesc"Filldatabasewithsampledata"task:populate=>:environmentdoRake::Task['db:reset'].invokeUser.create!(:name=>"ExampleUser",:email=>"example@railstutorial.org",:passwo
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi
如何将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.你能做的最好的事情是:
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我