急!LINUX下,GCC编译,原程序包含<semaphore.h>头文件,为啥编译时说sem_wait,sem_post等未定义的引用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了急!LINUX下,GCC编译,原程序包含<semaphore.h>头文件,为啥编译时说sem_wait,sem_post等未定义的引用相关的知识,希望对你有一定的参考价值。
RT
编译时加上参数:-lpthread要看报错的阶段,是在编译还是链接阶段.
如果编译时函数没有找到,那是头文件的问题,如果链接时未定义引用,那是c库的问题.
如果你的头文件都正常包含了,那可能你的c库没有使能semaphore的支持.追问
怎么加参数??在哪加?gcc -o prohy producer.c 我原来这么写的。。
追答对
在最后加
加了还是那样。。这是什么原因?GCC版本不行??我用的ubuntu,然后直接用命令下载的gcc
追答gcc -pthread -c x.c
gcc x.o -ox -pthread
如果编译时函数没有找到,那是头文件的问题,如果链接时未定义引用,那是c库的问题.
如果你的头文件都正常包含了,那可能你的c库没有使能semaphore的支持.追问
我才接触LINUX,不是很清楚,就是在文本编辑器里写好了程序,然后在UBUNTU的终端输入gcc编译命令后,出现的提示
追答把错误贴出来瞄瞄
参考技术B 楼上说的对啊,如果是在编译阶段,可能是头文件路径不对。把你gcc编译语句和报错信息贴出来吧,这样大家好帮你~ 参考技术C gcc -o prohy -lpthread producer.c追问加了还是那样。。这是什么原因?GCC版本不行??我用的ubuntu,然后直接用命令下载的gcc
来自:求助得到的回答 参考技术C 贴代码呀 你这几句太含糊啦追问太长粘不了,麻烦直接跟我说下有哪几种原因会导致这种错误提示。除了头文件还有什么可能?sem_wait 是库函数,为什么会未定义?
追答这个 ……
超级大牛会确切回答你 我没办法 菜鸟一个
Linux 相关编译知识
一直对编译的过程概念很模糊,总结记录一下方便以后复习。
Linux下gcc编译器使用:
gcc编译流程:
1、预处理 gcc -E hello.c -o hello.i 对包含的头文件和宏定义进行处理 2、编译 gcc -s hello.i -o hello.s 检查代码的规范性,是否有语法错误,把代码翻译成汇编语言 3、汇编 gcc -c hello.s -o hello.o 汇编语言转成二进制目标代码 4、链接 gcc hello.o -o hello |
上述流程中的第四步链接阶段,涉及到一个概念:函数库
函数库分为静态库和动态库两种。静态库是指编译链接时,将库文件的代码全部加入可执行文件中,因此生成的文件较大,但是在运行时不再需要库文件,
其后缀名为“.a”。动态库是在程序执行的时候加载库,这样可以节省开销,后缀名为".so"。
静态库:
静态库的生成及使用: 1、生成.o文件 gcc -c hello.c 2、制作静态库 ar rcsv libhello.a hello.o ar:归档工具,将hello.o归档成静态库 3、链接静态库 gcc -o hello_test hello_test.c -L. -lhello -L dir:在库文件的搜索路径列表中添加dir目录; -lname: 指示编译时链接到库文件libname.a或者libname.so |
动态库:
动态库的生成及使用: 1、生成.o文件 gcc -fPIC -c hello.c -fPIC:创建位置无关目标代码 2、制作动态库 gcc -shared -o libhello.so hello.o -share:生成动态文件 3、链接动态库 gcc -o hello_test hello_test.c -L. -lhello |
运行可执行程序之前,需要注册动态库的路径名,注册的几个方法:
1、修改/etc/ld.so.conf文件 2、修改LD_LIBRARY_PATH环境变量 3、将库文件直接复制到/lib或者/usr/lib目录下(这两个目录是系统的默认的库路径名) 列:cp libhello.so /lib |
关于-fPIC的详细解释可以到这个博主的文章链接查看:
http://blog.sina.com.cn/s/blog_54f82cc201011op1.html#cmt_57E8BB9B-7F000001-5E601934-7D9-8A0
以上是关于急!LINUX下,GCC编译,原程序包含<semaphore.h>头文件,为啥编译时说sem_wait,sem_post等未定义的引用的主要内容,如果未能解决你的问题,请参考以下文章