Boost Interprocess 找不到 boost/config/user.hpp

Posted

技术标签:

【中文标题】Boost Interprocess 找不到 boost/config/user.hpp【英文标题】:Boost Interprocess cannot find boost/config/user.hpp 【发布时间】:2018-04-12 13:06:13 【问题描述】:

我正在编译一个 Boost Interprocess 示例:

#include <interprocess/shared_memory_object.hpp>
#include <interprocess/mapped_region.hpp>
#include <cstring>
#include <cstdlib>
#include <string>

int main(int argc, char *argv[])

   using namespace boost::interprocess;

   if(argc == 1)  //Parent process
      //Remove shared memory on construction and destruction
      struct shm_remove
      
         shm_remove()  shared_memory_object::remove("MySharedMemory"); 
         ~shm_remove() shared_memory_object::remove("MySharedMemory"); 
       remover;

      //Create a shared memory object.
      shared_memory_object shm (create_only, "MySharedMemory", read_write);

      //Set size
      shm.truncate(1000);

      //Map the whole shared memory in this process
      mapped_region region(shm, read_write);

      //Write all the memory to 1
      std::memset(region.get_address(), 1, region.get_size());

      //Launch child process
      std::string s(argv[0]); s += " child ";
      if(0 != std::system(s.c_str()))
         return 1;
   
   else
      //Open already created shared memory object.
      shared_memory_object shm (open_only, "MySharedMemory", read_only);

      //Map the whole shared memory in this process
      mapped_region region(shm, read_only);

      //Check that memory was initialized to 1
      char *mem = static_cast<char*>(region.get_address());
      for(std::size_t i = 0; i < region.get_size(); ++i)
         if(*mem++ != 1)
            return 1;   //Error checking memory
   
   return 0;

但我得到一个编译错误:

fatal error: boost/config.hpp: No such file or directory

现在该文件确实存在,我能够通过包含丢失的头文件来修复错误:

g++ -c -g -I../../../space/dist/boost/boost_1_66_0/boost -I../../../space/dist/boost/boost_1_66_0/libs -include ../../../space/dist/boost/boost_1_66_0/boost/config.hpp -MMD -MP -MF "build/Debug/GNU-Linux/main.o.d" -o build/Debug/GNU-Linux/main.o main.cpp

但在这样做之后,我现在收到另一个关于类似文件的错误:

./../../../space/dist/boost/boost_1_66_0/boost/config.hpp:30:29: fatal error: boost/config/user.hpp: No such file or directory
 #  include BOOST_USER_CONFIG

发生了什么事?为什么编译不出来?

【问题讨论】:

为什么不将标题包含在 boost 目录中:#include &lt;boost/interprocess/shared_memory_object.hpp&gt; @vasek 我从 Boost 文档中获取了示例:boost.org/doc/libs/1_55_0/doc/html/interprocess/… 所以我认为我不需要? 当我将包含更改为boost/interprocess 并使用-lrt 标志编译时,它是works for me。 但在这些示例中,您可以看到包含 boost/ 前缀。 g++ -lrt -c -g -I../../../space/dist/boost/boost_1_66_0/boost/interprocess -MMD -MP -MF "build/Debug/GNU- Linux/main.o.d" -o build/Debug/GNU-Linux/main.o main.cpp main.cpp:1:49:致命错误:interprocess/shared_memory_object.hpp:没有这样的文件或目录#include 【参考方案1】:

您必须将 boost 库的包含设置为具有boost 子目录的目录,以便找到所有内部 boost 包含。

因此,如果您将构建命令行更改为

g++ -lrt -c -g -I../../../space/dist/boost/boost_1_66_0 -MMD -MP -MF "build/Debug/GNU-Linux/main.o.d" -o build/Debug/GNU-Linux/main.o main.cpp main.cpp

并更改您的包含以匹配您的代码will compile 的提升文档:

#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>

【讨论】:

以上是关于Boost Interprocess 找不到 boost/config/user.hpp的主要内容,如果未能解决你的问题,请参考以下文章

Boost.Interprocess内存位置

boost::interprocess::string 转换为 char*

boost::interprocess_mutex 与进程本地 boost::mutex

boost::interprocess::interprocess_condition::wait 在等待时不会原子地解锁互斥锁

boost::interprocess::message_queue 权限被拒绝

Boost.interprocess Vector 作为类成员