共享内存中的映射:由于未满足的date_time依赖性,Boost.Interprocess演示失败

时间:2014-12-02 16:52:09

标签: c++ boost linker shared-memory dependency-management

我想创建多个进程可以访问的共享map对象。我发现的最有希望的方法是this demo code from Boost.Interprocess,它在托管共享内存段中分配map个对象。这个问题主要是关于我所遇到的助推问题,但如果有人采用非提升替代方法,我也会感激不尽。

我是全新的提升者:它看起来很神奇,如果巨大的话,我对它的说法“经常,没有什么可以建立”感到鼓舞。但是在这种情况下,承诺被破坏了似乎是一种毫无意义的方式,并且由于内部的依赖性问题,我无法编译演示。

我在Windows上安装了Visual C ++ Express 2010。将演示代码保存为shmap.cpp后,我执行以下操作:

"%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat"
cl /EHsc /I boost_1_57_0 shmap.cpp

它编译好了,但后来我明白了:

LINK : fatal error LNK1104: cannot open file 'libboost_date_time-vc100-mt-s-1_57.lib'

这让我感到很惊讶。 (Q1):我没有要求库---在哪里以及如何引导链接器期望它们? (Q2):为什么特别要求date_time?代码中的任何内容都不具备与计算,引用或包含的日期或时间相关的功能。这是一个过度热心的毯子依赖的情况,如果有的话,我可以把它除掉吗?

无论如何,首先要尝试的是玩游戏:在boost_1_57_0目录中我运行bootstrap.bat后跟b2。地球转了好几度,成功建立了提升,我重试了:

cl /EHsc /I boost_1_57_0 shmap.cpp /link /LIBPATH:boost_1_57_0\stage\lib

我仍然遇到相同的链接器错误。这是因为b2似乎在其名称中构建了带有-mt--mt-gd-的库,但没有使用链接器正在查找的-mt-s-。 Boost的“入门”网页告诉我这些是什么,但没有告诉我(Q3):如何更改构建的库类型或链接器期望的类型?

2 个答案:

答案 0 :(得分:2)

  

"代码中的任何内容都不具备与计算,引用或包含的日期或时间相关的功能。"

     

(Q2):为什么要特别要求date_time?

显然你使用的东西取决于它。

例如,互斥操作具有 timed_lock 功能

  

(Q1):我没有向项目中添加库 - 在哪里以及如何提升链接器以期望它们?

默认情况下,Boost会自动修改。这使用MSVC ++特定的编译指示来指示正确链接库的正确风格。这是一个很棒的功能。

您只需确保导入库位于项目的库路径中。


有一些方法可以在boost中禁用自动链接(我认为它涉及定义BOOST_ALL_NO_LIB)

可能成为

的方法

我参考了相关文档。

答案 1 :(得分:2)

这是我所学到的,在很大程度上要归功于sehe

Q1:这是神奇的 - 特别是MSVC特有的魔法 - 而且它发生是因为它是必要的。

Q2:它变得不必要 ---即。如果我将date_time添加到编译标志,则可以编译演示而无需查找二进制/DBOOST_ALL_NO_LIB lib。但是,一旦我开始使用额外的IPC功能(如时间相关的静音),这是否仍然是真的还不清楚。

问题3:this table的“Boost.Build选项”列中的字符串可以传递给b2,因此创建*-mt-s-*.lib的方式是b2 runtime-link=static。这最终让我在没有/DBOOST_ALL_NO_LIB标志的情况下进行编译,并发现date_time是该演示似乎需要的唯一库。

我还发现可以使用the bcp tool跟踪依赖项,并且(最终)还可以首先构建bcp,如下所示:

build:
cd boost_1_57_0
bjam tools\bcp
cd ..

report:
boost_1_57_0\dist\bin\bcp.exe --boost=boost_1_57_0 --report --scan shmap.cpp  report.html

结果是,地图共享内存演示需要来自boost 1.57.0的1421个文件。