QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4250|回复: 5

请教一个GCC的问题

[复制链接]
发表于 2005-10-23 23:30:16 | 显示全部楼层 |阅读模式
在看了 mozilla 的 “gcc常用的使用方法”,有一个疑问,问题源于一次实验

我们在实验时候要使用clone()来创建四个进程。在链接的时候出现的错误

/tmp/ccYR00NJ.o(.text+0x4: In function `main':
clone_call.c: undefined reference to `sem_init'
/tmp/ccYR00NJ.o(.text+0x64):clone_call.c: undefined reference to `sem_init'
/tmp/ccYR00NJ.o(.text+0x13f): In function `producer':
clone_call.c: undefined reference to `sem_wait'
/tmp/ccYR00NJ.o(.text+0x1d9):clone_call.c: undefined reference to `sem_post'
/tmp/ccYR00NJ.o(.text+0x233): In function `consumer':
clone_call.c: undefined reference to `sem_wait'
/tmp/ccYR00NJ.o(.text+0x2a:clone_call.c: undefined reference to `sem_post'
collect2: ld returned 1 exit status

原因是我们使用 GCC 的时候,参数错误了,只要 GCC 时,使用参数 -pthread 或 -lpthread 就通过了

显然,GCC链接时要库libpthread.so,但是 GCC 提示的错误是 undefined reference to sem_* funtions ,这样函数都声明在头文件 semaphore.h 里,当然/usr/lib里基本就没有libsemaphore.so。

sem_*的实现是在库libpthread.so里吗?这个提示让我在网上郁闷了一天
发表于 2005-10-24 18:15:08 | 显示全部楼层
你可以 nm 看一眼啊~~
我也是刚知道 nm 可以看 so 文件的 reference 。
应该是 T 的是提供的接口。
回复

使用道具 举报

 楼主| 发表于 2005-10-24 21:48:47 | 显示全部楼层
我用nm看了一下我编译好的文件,出来了一些信息,但是我看不懂,可以帮我解释一下吗?

08049ba4 B bp
08049b98 A __bss_start
08049be0 B buffer
080485e4 t call_gmon_start
         U clone@@GLIBC_2.0
08049ba0 b completed.1
08048870 T consumer
08049a68 d __CTOR_END__
08049a64 d __CTOR_LIST__
08049b8c D __data_start
08049b8c W data_start
080489a0 t __do_global_ctors_aux
08048610 t __do_global_dtors_aux
08049b90 D __dso_handle
08049a70 d __DTOR_END__
08049a6c d __DTOR_LIST__
08049a78 D _DYNAMIC
08049b98 A _edata
08049c20 A _end
         U exit@@GLIBC_2.0
080489c4 T _fini
08049a64 A __fini_array_end
08049a64 A __fini_array_start
080489e0 R _fp_hw
08048640 t frame_dummy
08048a60 r __FRAME_END__
08049b4c D _GLOBAL_OFFSET_TABLE_
         w __gmon_start__
080484bc T _init
08049a64 A __init_array_end
08049a64 A __init_array_start
080489e4 R _IO_stdin_used
08049a74 d __JCR_END__
08049a74 d __JCR_LIST__
         w _Jv_RegisterClasses
08048994 T __libc_csu_fini
08048940 T __libc_csu_init
         U __libc_start_main@@GLIBC_2.0
08048674 T main
         U malloc@@GLIBC_2.0
08049bc0 B mutex
08049b94 d p.0
08049a64 A __preinit_array_end
08049a64 A __preinit_array_start
         U printf@@GLIBC_2.0
08048780 T producer
08049c10 B product
         U pthread_mutex_init@@GLIBC_2.0
         U pthread_mutex_lock@@GLIBC_2.0
         U pthread_mutex_unlock@@GLIBC_2.0
         U sem_init@@GLIBC_2.1
         U sem_post@@GLIBC_2.1
         U sem_wait@@GLIBC_2.1
         U sleep@@GLIBC_2.0
080485c0 T _start
         U strcpy@@GLIBC_2.0
08049c00 B warehouse
回复

使用道具 举报

发表于 2005-10-24 21:54:45 | 显示全部楼层
是让你用 nm 找哪个 so 有“ T  sem_init”
回复

使用道具 举报

 楼主| 发表于 2005-10-25 17:28:12 | 显示全部楼层
好,我看看,不过我曾经nm 过 libpthread.so
出现了错误信息
nm: libpthread.so: 不可识别的文件格式
我再找找别的,但是我在编译时,要链接的就是这个 libpthread.so

要上课了,回来再看有没有别的文件可以识别的~~
回复

使用道具 举报

发表于 2008-5-20 18:03:54 | 显示全部楼层

想請教一個關於collect2: ld returned 1 exit status的問題

大家好:
我有個問題想請教。
我使用一個叫"Glomosim" 的模擬器,是架在debian機器上。
在dsr.pc檔案中寫入
void RoutingDsrInitStats(GlomoNode *node)
pthread_t thread1;
struct arg *arg1;

arg1 = (struct arg*)malloc(sizeof(struct arg));
arg1->node = node->nodeAddr;
arg1->destAddr = ANY_DEST ;

pthread_create( &thread1, NULL, RoutingDsrInitiateRREQ, (void*) arg1);

另外,在dsr.h檔案中寫入。
struct arg{
  NODE_ADDR node;
  NODE_ADDR destAddr;
};

當我編譯它時
/home/public/glomosim/main >make clean
/home/public/glomosim/main >make
它出現一些錯誤訊息
../network/dsr.o: In function `RoutingDsrInitStats':
../network/dsr.pc:1296: undefined reference to `pthread_create'
collect2: ld returned 1 exit status
Failed linking '../bin/glomosim'

我試著鍵入
/home/public/glomosim/main >make -pthread

但它仍然無法運作。
可以請教各位先進是否能指教我是否有任何不對的地方呢?
謝謝大家,非常感謝。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-3-29 05:02 , Processed in 0.054218 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表