C++ aumenta las bibliotecas shared_memory_object referencia no definida a ''shm_open''
boost compiler-errors (3)
Mi mismo problema se resolvió con la respuesta de @anio, pero necesitaba hacer un trabajo adicional. Como no puedo comentar debido a la baja reputación. Así que estoy presentando mis centavos, puede ser alguien que lo encuentre útil. Soy un bebé que camina todo, así que "lo siento" si me parece infantil.
Estoy usando Eclipse en Debian para compilación cruzada para arm-linux-gnueabihf-g ++. Así que primero encontré la ubicación para "librt"
/$ find -iname "librt*"
./home/myuser/targetsysroot/usr/lib/arm-linux-gnueabihf/librt.a
./home/myuser/targetsysroot/usr/lib/arm-linux-gnueabihf/librt.so
./home/myuser/targetsysroot/usr/lib/arm-linux-gnueabihf/librtmp.so.0
./home/myuser/targetsysroot/lib/arm-linux-gnueabihf/librt-2.13.so
./home/myuser/targetsysroot/lib/arm-linux-gnueabihf/librt.so.1
./lib/arm-linux-gnueabihf/librt.so.1
./lib/arm-linux-gnueabihf/librt-2.19.so
./lib/i386-linux-gnu/librt.so.1
./lib/i386-linux-gnu/i686/cmov/librt.so.1
./lib/i386-linux-gnu/i686/cmov/librt-2.19.so
./lib/i386-linux-gnu/librt-2.19.so
Como prefiero sincronizar con la máquina de destino remota, agregué "ruta sysroot" para mi biblioteca en las propiedades del proyecto Eclipse "Ruta de búsqueda de biblioteca (-L)"
/home/myuser/targetsysroot/usr/lib/arm-linux-gnueabihf
También agregué "rt" a Bibliotecas (-l), que finalmente resolvió mi problema.
En caso de que esté compilando con el uso.
g++ -L $YOUR_PATH_TO_LIB$ shared.o -o shared -lrt
Reemplaza $ YOUR_PATH_TO_LIB con el tuyo.
Intenté compilar el siguiente código en ubuntu 11.04:
#include <boost/interprocess/shared_memory_object.hpp>
#include <iostream>
int main()
{
boost::interprocess::shared_memory_object shdmem(boost::interprocess::open_or_create, "Highscore", boost::interprocess::read_write);
shdmem.truncate(1024);
std::cout << shdmem.get_name() << std::endl;
boost::interprocess::offset_t size;
if (shdmem.get_size(size))
std::cout << size << std::endl;
}
Solo para obtener los siguientes errores:
/tmp/cc786obC.o: In function `boost::interprocess::shared_memory_object::priv_open_or_create(boost::interprocess::detail::create_enum_t, char const*, boost::interprocess::mode_t, boost::interprocess::permissions const&)'':
shared_memory.cpp:(.text._ZN5boost12interprocess20shared_memory_object19priv_open_or_createENS0_6detail13create_enum_tEPKcNS0_6mode_tERKNS0_11permissionsE[boost::interprocess::shared_memory_object::priv_open_or_create(boost::interprocess::detail::create_enum_t, char const*, boost::interprocess::mode_t, boost::interprocess::permissions const&)]+0xe0): undefined reference to `shm_open''
shared_memory.cpp:(.text._ZN5boost12interprocess20shared_memory_object19priv_open_or_createENS0_6detail13create_enum_tEPKcNS0_6mode_tERKNS0_11permissionsE[boost::interprocess::shared_memory_object::priv_open_or_create(boost::interprocess::detail::create_enum_t, char const*, boost::interprocess::mode_t, boost::interprocess::permissions const&)]+0x116): undefined reference to `shm_open''
shared_memory.cpp:(.text._ZN5boost12interprocess20shared_memory_object19priv_open_or_createENS0_6detail13create_enum_tEPKcNS0_6mode_tERKNS0_11permissionsE[boost::interprocess::shared_memory_object::priv_open_or_create(boost::interprocess::detail::create_enum_t, char const*, boost::interprocess::mode_t, boost::interprocess::permissions const&)]+0x16c): undefined reference to `shm_open''
shared_memory.cpp:(.text._ZN5boost12interprocess20shared_memory_object19priv_open_or_createENS0_6detail13create_enum_tEPKcNS0_6mode_tERKNS0_11permissionsE[boost::interprocess::shared_memory_object::priv_open_or_create(boost::interprocess::detail::create_enum_t, char const*, boost::interprocess::mode_t, boost::interprocess::permissions const&)]+0x1c0): undefined reference to `shm_open''
collect2: ld returned 1 exit status
Comando utilicé para compilar el archivo: g ++ -o shared shared.cpp
Comando utilicé para instalar las bibliotecas boost: sudo apt-get install libboost-dev libboost-doc
Solo añadiendo a la respuesta de @Anio:
Al vincular, es posible que se deba agregar el indicador -lrt al final del comando. Tratar:
g++ -L /lib shared.o -o shared -lrt
shm_open está disponible mediante la vinculación de librt. Intente pasar el indicador -lrt al vinculador.
Prueba: g ++ -c -Wall shared.cpp
g ++ -L / lib -lrt shared.o -o shared