【问题标题】:undefined reference 'shm_open', already add -lrt flag here未定义的引用 'shm_open',已在此处添加 -lrt 标志
【发布时间】:2012-03-29 10:23:48
【问题描述】:

我刚刚系统崩溃并重新安装了 Ubuntu 11.10,我的代码产生了这个奇怪的错误。

我写了一个简单的代码示例来测试问题出在哪里:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>

int main (void) {

    int i;

    i = shm_open ("/tmp/shared", O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);   printf ("shm_open rc = %d\n", i);

    shm_unlink ("/tmp/shared");

    return (0);
}

编译命令是

gcc -lrt test.c -o test

错误是:

/tmp/ccxVIUiP.o: In function `main':
test.c:(.text+0x21): undefined reference to `shm_open'
test.c:(.text+0x46): undefined reference to `shm_unlink'
collect2: ld returned 1 exit status

我已经加了-lrt lib,为什么还是编译不出来?

【问题讨论】:

  • 我想你可能想要-pthread,但我忘记了原因。
  • 谢谢,我导师的电脑需要添加-pthread,它是lpthread的改进版本,具有线程安全功能。我可以添加 lrt。我认为 lrt 和 pthread 都是 POSIX 的库?
  • @bxshi:POSIX 没有指定库名称;各种 Unix 风格在不同名称的库中都有函数。
  • 这个标题回答了我的问题:啊,我需要-lrt!

标签: c linux


【解决方案1】:

最后的库:

gcc test.c -o test -lrt

来自GCC Link Options:

-图书馆 -l 库 链接时搜索名为 library 的库。 (将库作为单独参数的第二种选择 仅用于 POSIX 合规性,不推荐使用。) 在命令中编写此选项的位置有所不同; 链接器在 它们被指定的顺序。 因此,`foo.o -lz bar.o' 在文件 foo.o 之后搜索库 `z' 但是 bar.o 之前如果 bar.o 引用 `z' 中的函数,那些函数 可能无法加载。

【讨论】:

  • 我想在中间的某个地方添加库也可以。只是好奇为什么gcc 认为订单如此重要?
  • 这次我需要在这个gcc命令的末尾添加lib,但是在我重新安装我的linux之前,我可以在gcc之后添加lib,它也可以编译。这是怎么回事?是否有任何配置文件或变量?
  • @PavanManjunath:较新的 GCC 版本在命令行的任何位置以任何顺序接受库。较旧的要求它们最后并按依赖顺序列出(因此任何需要librt 的东西都在它之前)。
  • @PavanManjunath:必须。 按顺序搜索库以解析未定义的符号。如果顺序无关紧要,则在您将要搜索的两个或更多库中定义所需符号时,将无法控制使用哪个库。
  • @R..:我的 GCC (Debian 4.4.5-8) 将 OP 的程序与给定的命令行链接得很好。我不确定这个功能是什么时候引入的,具体是如何实现的,但它之前引发了很多 SO 问题。
【解决方案2】:

修改编译行

gcc -lrt test.c -o test

到

gcc test.c -o test -lrt

【讨论】:

  • gcc 是否总是需要在最后添加lib?我没有更改我的代码和 Makefile,但在我重新安装计算机之前,它工作正常。
【解决方案3】:

在Expert C programming第108页: <Handy Heuristic> Where to Put Library Options:Always put the -l library options at the rightmost end of your compilation command line. 但这并没有说明原因,所以我想这有点规则?:)

【讨论】:

    【解决方案4】:

    对于像我这样使用超自动魔法CMAKE的人,请尝试添加:

    target_link_libraries(your_binary_name PRIVATE librt.so)
    

    到你的 CMakeLists.txt

    或者,根据需要将 PRIVATE 替换为 PUBLIC..


    如果您有完善的库路径(例如 /usr/lib 中所有需要的库),您可能只需在 CMakeLists.txt 中声明即可:

    set(CMAKE_CXX_FLAGS "-lrt")

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多