将C程序分解为多个文件时,gcc返回未定义的引用

时间:2015-04-15 18:48:30

标签: c gcc ld

我已经提供了一个示例C文件,我想将其分解为一对.c文件和一个.h文件。在分割完所有内容之后,我无法让程序编译,但我认为这是一个简单的解决方案。我的C生锈了。

capture.h中

#ifndef __CAPTURE_H
#define __CAPTURE_H

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include "master.h"
#include "pvcam.h"

static void AcquireStandard( int16 hCam, int16 num_frames, uns32 exp_time );
void setROI( rgn_type* roi, uns16 s1, uns16 s2, uns16 sbin, uns16 p1, uns16 p2, uns16 pbin );
void printROI( int16 roi_count, rgn_type* roi );
void print_pv_error( );
void setFullFrame( int16 hcam, rgn_type* roi );
#endif

的capture.c

#include "capture.h"

void AcquireStandard( int16 hCam, int16 num_frames, uns32 exp_time ) {
... Does lots of stuff ...
}
... Many other functions, etc...

pixis.c

    #include "capture.h"

    int main(int argc, char **argv)
    {
        char cam_name[CAM_NAME_LEN];    /* camera name                    */
        int16 hCam;                     /* camera handle                  */
        int16 cam_selection;
        int16 num_frames, circ_buff_size, buffer_type;
        uns32 port, shtr_open_mode;
        uns32 enum_param, exp_time;
        int16 adc_index;
        int16 gain;
        uns16 exp_res_index;
        char *s;
        ..... snip .....
        AcquireStandard( hCam, num_frames, exp_time );
        pl_cam_close( hCam );
    pl_pvcam_uninit();
    return 0;
}

我剪掉了很多无关紧要的东西。当我编译时,我收到以下错误:

gcc -o pixis pixis.o capture.o -I/usr/local/pvcam/examples -lpvcam -ldl -lpthread -lraw1394
pixis.o: In function `main':
pixis.c:(.text+0x14a): undefined reference to `AcquireStandard'
collect2: ld returned 1 exit status
make: *** [pixis] Error 1

AcquireStandard在.o文件中,我用nm检查了它:

    nm capture.o 
00000000 t AcquireStandard
00000000 d _master_h_
00000004 d _pvcam_h_
         U fclose
         U fopen
         U free
         U fwrite
         U malloc
         U pl_error_code
         U pl_error_message
         U pl_exp_check_status
         U pl_exp_finish_seq
         U pl_exp_init_seq
         U pl_exp_setup_seq
         U pl_exp_start_seq
         U pl_exp_uninit_seq
         U pl_get_param
00000350 T printROI
00000440 T print_pv_error
         U printf
         U puts
00000489 T setFullFrame
000002d4 T setROI

现在我很难过。在过去的几年里,gcc中有什么变化,或者我忘了一些简单的细节吗?

1 个答案:

答案 0 :(得分:1)

这里的问题是AcquireStandard()函数最初的原型是static,这意味着它的可见性受限于它实现的文件。在这个重构中,函数的可见性需要达到退出到其他来源 - 但标题仍然在函数上有static关键字。

还要注意nm命令的输出,特别是代表源中函数的这两行之间的差异:

00000000 t AcquireStandard
00000489 T setFullFrame

T表示对象文本中具有全局可见性的函数,而t则表示可见性是本地的。

static中删除原型上的capture.h,问题就会解决。