急!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

参考技术A 要看报错的阶段,是在编译还是链接阶段.
如果编译时函数没有找到,那是头文件的问题,如果链接时未定义引用,那是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等未定义的引用的主要内容,如果未能解决你的问题,请参考以下文章

Linux 相关编译知识

linux下c语言gcc编译的时候如果不知道.c文件怎么链接的?

linux终端下如何进行C语言编译

#导入Word文档图片# Linux下GDB调试工具的运用

linux下使用gcc编译运行C程序

GCC编译命令常用选项