【问题标题】:C++ boost libraries shared_memory_object undefined reference to 'shm_open'C++ 提升库 shared_memory_object 未定义对“shm_open”的引用
【发布时间】:2011-12-20 13:51:51
【问题描述】:

我尝试在 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

【问题讨论】:

  • 我有完全相同的错误,但解决方案对我不起作用。

标签: c++ boost compiler-errors shared-memory ubuntu-11.04


【解决方案1】:

shm_open 是通过链接 librt 来实现的。尝试将 -lrt 标志传递给链接器。

尝试: g++ -c -Wall shared.cpp

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

【讨论】:

  • @TerryLiYifeng 你可能需要指定librt的路径,它应该在/lib中。
  • 在我的 Arch linux 链接中 -lrt 处理了 shm 错误。但是我需要添加 -lpthread 来消除一些额外的错误。
【解决方案2】:

只是添加到@anio 的答案:

链接时,可能需要在命令末尾添加 -lrt 标志。 试试:

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

【讨论】:

  • 但是为什么呢?
【解决方案3】:

@anio 的回答解决了我同样的问题,但我需要做额外的工作。由于声誉低,我无法发表评论。所以我正在展示我的便士,可能有人觉得它有帮助。我是婴儿踩着一切,所以如果我看起来很幼稚,请“抱歉”。

我在 Debian 上使用 Eclipse 对 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

还在库 (-l) 中添加了“rt”,最终解决了我的问题。

如果你正在编译使用

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

用你的替换 $YOUR_PATH_TO_LIB。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多