2015-10-01 97 views
0

我是一个可以在C编程的总计noob。我花了一些代码,当我运行make抛出这个错误:连接C代码失败

Undefined symbols for architecture x86_64: 
    "_rp_osc_adc_sign", referenced from: 
     _rp_osc_meas_min_max in worker.o 
     _meas_period in worker.o 
    "_rp_osc_meas_cnv_cnt", referenced from: 
     _rp_osc_meas_convert in worker.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [make_c_app] Error 

我使用OS XYosemite和这里的make文件

CC=$(CROSS_COMPILE)gcc 
RM=rm 

OBJECTS=main.o fpga.o worker.o calib.o fpga_awg.o generate.o fpga_pid.o pid.o 

INCLUDE= 

#CFLAGS=$(CFLAGS) -Wall -Werror -g 
CFLAGS+= -Wall -Werror -g -fPIC $(INCLUDE) 
LDFLAGS=-shared 


OUT_DIR=../ 
C_OUT_NAME=$(OUT_DIR)controller.so 

all: make_c_app 
clean: clean_c_app 

make_c_app: $(OBJECTS) 
    $(CC) -o $(C_OUT_NAME) $(OBJECTS) $(CFLAGS) $(LDFLAGS) 

clean_c_app: 
    $(RM) -f $(C_OUT_NAME) $(OBJECTS) 

和链接器抱怨

int rp_osc_meas_min_max(rp_osc_meas_res_t *ch_meas, int sig_data) 
{ 
    int s_data = rp_osc_adc_sign(sig_data); 

    if(ch_meas->min > s_data) 
     ch_meas->min = s_data; 
    if(ch_meas->max < s_data) 
     ch_meas->max = s_data; 

    ch_meas->avg += s_data; 

    return 0; 
} 
方法

错误可能来自哪里?

编辑:rp_osc_adc_sign是指通过以下方式

inline int rp_osc_adc_sign(int in_data) 
{ 
    int s_data = in_data; 
    if(s_data & (1<<(c_osc_fpga_adc_bits-1))) 
     s_data = -1 * ((s_data^((1<<c_osc_fpga_adc_bits)-1)) + 1); 
    return s_data; 
} 
+1

之前写它说的'rp_osc_adc_sign'功能不被任何定义inline标签。可能它在您忘记在makefile中列出的另一个文件中定义。 –

+0

我看不到您的make文件中的C文件的编译,只链接目标文件。也许嘿没有更新?此外,链接器抱怨'rp_osc_meas_min_max'内的函数'_rp_osc_adc_sign'。它是否实施? – MByD

+0

@MByD Makefiles具有[隐式规则](https://www.gnu.org/software/make/manual/html_node/Implicit-Rules.html)。包括从'.c'文件构建'.o'。 – kaylum

回答

1

您应该删除是函数

rp_osc_adc_sign(int in_data) 

rp_osc_meas_cnv_cnt