Boost Interprocess не может найти boost/config/user.hpp

Я компилирую пример 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

#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;
}
66_0/boost -I../../../space/dist/boost/boost
#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;
}
66_0/libs -include ../../../space/dist/boost/boost
#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;
}
66_0/boost/config.hpp
-MMD -MP -MF "build/Debug/GNU-Linux/main.od" -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

Что здесь происходит? Почему это не скомпилируется?


person user997112    schedule 12.04.2018    source источник
comment
почему бы вам не включить заголовок с каталогом повышения: #include <boost/interprocess/shared_memory_object.hpp>?   -  person vasek    schedule 12.04.2018
comment
@vasek Я взял пример из документации Boost: boost .org/doc/libs/1_55_0/doc/html/interprocess/, так что я не думал, что мне это нужно?   -  person user997112    schedule 12.04.2018
comment
когда я меняю включение на boost/interprocess и компилирую с флагом -lrt, у меня работает.   -  person vasek    schedule 12.04.2018
comment
но в этих примерах вы можете видеть, что префикс boost/ включен.   -  person vasek    schedule 12.04.2018
comment
g++ -lrt -c -g -I../../../space/dist/boost/boost_1_66_0/boost/interprocess -MMD -MP -MF build/Debug/GNU-Linux/main.od -o build/ Debug/GNU-Linux/main.o main.cpp main.cpp:1:49: фатальная ошибка: interprocess/shared_memory_object.hpp: Нет такого файла или каталога #include ‹interprocess/shared_memory_object.hpp›   -  person user997112    schedule 12.04.2018


Ответы (1)


Вы должны установить свои включения для библиотеки повышения в каталог с подкаталогом 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

и измените свои включения, чтобы они соответствовали документации по ускорению, которую ваш код будет компилировать:

#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
person vasek    schedule 12.04.2018