Search code examples
c++boostinterprocessboost-interprocess

Boost Interprocess cannot find boost/config/user.hpp


I am compiling a Boost Interprocess example:

#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;
}

but I was getting a compile error:

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

Now the file does exist and I was able to fix the error by including the missing header file:

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

but after doing that I now get another error about a similar file:

./../../../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

What is going on? Why won't this compile?


Solution

  • You must set your includes for boost library to the directory with boost subdirectory so that all the internal boost includes are found.

    So if you change your build commandline to

    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
    

    and change your includes to match boost documentation your code will compile:

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