2015-10-01 138 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