我已经提供了一个示例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中有什么变化,或者我忘了一些简单的细节吗?
答案 0 :(得分:1)
这里的问题是AcquireStandard()
函数最初的原型是static
,这意味着它的可见性受限于它实现的文件。在这个重构中,函数的可见性需要达到退出到其他来源 - 但标题仍然在函数上有static
关键字。
还要注意nm
命令的输出,特别是代表源中函数的这两行之间的差异:
00000000 t AcquireStandard
00000489 T setFullFrame
T
表示对象文本中具有全局可见性的函数,而t
则表示可见性是本地的。
在static
中删除原型上的capture.h
,问题就会解决。