未定义引用“shm_open”,已在此处添加 -lrt 标志
- 2024-11-13 08:36:00
- admin 原创
- 21
问题描述:
我的系统刚刚崩溃,我重新安装了 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
", 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,为什么还是无法编译?
解决方案 1:
最后的图书馆:
gcc 测试.c -o 测试-lrt
来自GCC 链接选项:
-l 库
-l 库
链接时搜索名为 library 的库。
(第二种选择是将库作为单独的参数
仅用于 POSIX 兼容并且不推荐。
在命令中写入此选项的位置会有所不同;
链接器搜索并处理
它们是按指定的顺序指定的。
因此,“foo.o -lz bar.o”在文件 foo.o 之后搜索库“z”,但
在 bar.o 之前。如果 bar.o 引用“z”中的函数,则这些函数
可能无法加载。
解决方案 2:
将编译行从
gcc -lrt test.c -o test
到
gcc test.c -o test -lrt
解决方案 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
或者,根据需要用 PUBLIC 替换 PRIVATE。
如果您已经明确建立了库路径(例如,所有需要的库都在 /usr/lib 中),那么只需在CMakeLists.txt中声明即可:
set(CMAKE_CXX_FLAGS "-lrt")
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD