C ++ Boost библиотеки shared_memory_object неопределенная ссылка на 'shm_open' - PullRequest
17 голосов
/ 02 ноября 2011

Я попытался скомпилировать следующий код в 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 ++ -oshared shared.cpp

Команда, которую я использовал для установки библиотек наддува: sudo apt-get install libboost-dev libboost-doc

Ответы [ 3 ]

20 голосов
/ 02 ноября 2011

shm_open доступен по ссылке librt. Попробуйте передать флаг -lrt компоновщику.

Try: g ++ -c -Wall shared.cpp

g ++ -L / lib -lrt shared.o -o shared

1 голос
/ 04 февраля 2016

Моя та же проблема была решена из ответа @ 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» в библиотеки (-l), что в конечном итоге решило мою проблему.

В случае, если вы компилируете с использованием

g++ -L $YOUR_PATH_TO_LIB$ shared.o -o shared -lrt

замените $ YOUR_PATH_TO_LIB своим.

0 голосов
/ 19 апреля 2015

Просто добавляю к ответу @ anio:

При связывании может потребоваться добавить флаг -lrt в конце команды. Попробуйте:

g++ -L /lib shared.o -o shared -lrt
...