地图在共享存储器:Boost.Interprocess中演示失败由于未满足的依赖性DATE_TIME

2019-10-21 08:32发布

我想创建共享map多个进程可以访问的对象。 最有希望的方法,我发现是从Boost.Interprocess中这个演示代码 ,其中分配map在管理共享内存的分段对象。 这个问题将主要是关于我在升压问题,但我想也很感激,如果任何人有非升压的替代方法。

我完全新的提升:它看起来令人惊讶,如果巨大的,我被它要求鼓励“的时候,没有什么建设”。 但是,在这种情况下,这一承诺在什么似乎是一场毫无意义的方式打破了,我不能编译,因为内部提升依赖问题的演示。

我在Windows上,使用Visual C ++快讯2010年安装。 保存演示代码后shmap.cpp我做到以下几点:

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

它编译OK,但后来我得到这个:

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):我怎样才能改变,要么被建库的类型,或者链接器所需的类型?

Answer 1:

“在代码中的任何一点的任何特定功能的计算,参考或包含日期或时间。”

(Q2):为什么它会要求DATE_TIME特别?

显然,你使用过的东西依赖于它。

例如互斥操作有timed_lock功能

(Q1):我没加库项目---在那里和提升是如何导致链接指望他们?

升压并默认autolinking。 它使用MSVC ++编译指示的具体指示正确链接库右侧的味道。 这是一个真棒功能。

你只需要确保导入库是项目库路径上。


有办法在推动禁用自动连接(我认为这涉及定义BOOST_ALL_NO_LIB)

可能有办法

  • 禁用升压DATE_TIME(滴加特征)依赖; 看到autl链接描述入门指南
  • 链接到DATE_TIME静态(或使其仅邮件头)

我指的这个文件。



Answer 2:

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

Q1:它的魔力---特别是,MSVC特定魔法---它是因为它是必要的。

Q2:没有必要 ---即演示可以在不需要寻找一个二进制编译date_time LIB ---如果我添加/DBOOST_ALL_NO_LIB到编译标志。 但目前还不清楚这是否仍是如此,一旦我开始使用更多的IPC功能,例如时间依赖性mutexing。

Q3:从字符串的“Boost.Build选项”一栏这个表可以传递给b2 ,这样的方式来创建*-mt-s-*.lib就是b2 runtime-link=static 。 这终于让我编译没有/DBOOST_ALL_NO_LIB标志,并发现date_time为演示似乎唯一需要的图书馆。

我还发现,依赖关系可以被跟踪的BCP工具 ,和(最终)还如何建立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

其结果是,地图,在共享内存演示从升压1.57.0需要1421个文件。



文章来源: maps in shared memory: Boost.Interprocess demo fails due to unmet date_time dependency