Ответ 1
shm_open предоставляется путем связывания librt. Попробуйте передать флаг -lrt в компоновщик.
Try: g++ -c -Wall shared.cpp
g++ -L/lib -lrt shared.o -o shared
Я попытался скомпилировать следующий код на 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;
}
чтобы получить следующие ошибки:
/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
Команда, которую я использовал для компиляции файла: g++ -o shared shared.cpp
Команда, которую я использовал для установки библиотек boost: sudo apt-get install libboost-dev libboost-doc
shm_open предоставляется путем связывания librt. Попробуйте передать флаг -lrt в компоновщик.
Try: g++ -c -Wall shared.cpp
g++ -L/lib -lrt shared.o -o shared
Моя же проблема была решена из ответа @anio, но мне нужно было выполнить дополнительную работу. Как я не могу комментировать из-за низкой репутации. Поэтому я представляю свои гроши, может быть, кто-то найдет это полезным. Я - ребенок, все на шаг, так что "извините", если я кажусь ребяческим.
Я использую Eclipse на Debian для кросс-компиляции для arm-linux-gnueabihf-g++. Поэтому я впервые нашел место для "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
Как я предпочитаю синхронизировать с удаленной целевой машиной, я добавил "путь sysroot" для моей библиотеки в свойства проекта eclipse "Путь поиска библиотеки (-L)"
/home/myuser/targetsysroot/usr/lib/arm-linux-gnueabihf
Также добавлен "rt" в Libraries (-l), который в конечном итоге решил мою проблему.
В случае компиляции с использованием
g++ -L $YOUR_PATH_TO_LIB$ shared.o -o shared -lrt
замените $YOUR_PATH_TO_LIB своим.
Просто добавив к ответу @anio:
При связывании в конце команды может потребоваться добавить флаг -lrt. Попробуйте:
g++ -L /lib shared.o -o shared -lrt