2015-10-01 5 views
0

I a ma total noob in C программирование. Я взял некоторый код, который выдает эту ошибку, когда я бегу сделать:сбой связи 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 и вот файл грим

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; 
} 

Откуда ошибка?

EDIT: 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' нигде не определено. Возможно, это определено в другом файле, который вы забыли перечислить в make-файле. –

+0

Я не вижу компиляции файлов C в ваших файлах make, только связывая объектные файлы. возможно, они не обновлены? Кроме того, компоновщик жалуется на функцию '_rp_osc_adc_sign', которая находится внутри' rp_osc_meas_min_max'. Это реализовано? – MByD

+0

@MByD Makefiles имеют [неявные правила] (https://www.gnu.org/software/make/manual/html_node/Implicit-Rules.html). В том числе создание '.o' из' .c' файлов. – kaylum

ответ

1

Вы должны удалить inline тег, который записывается перед функцией

rp_osc_adc_sign(int in_data) 

rp_osc_meas_cnv_cnt 
Смежные вопросы