【发布时间】:2015-12-30 00:49:08
【问题描述】:
我是C 编程的菜鸟。我在运行 make 时使用了一些引发此错误的代码:
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 X Yosemite,这是制作文件
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;
}
【问题讨论】:
-
这是说
rp_osc_adc_sign函数没有在任何地方定义。可能它是在您忘记在 makefile 中列出的另一个文件中定义的。 -
我在你的 make 文件中没有看到 C 文件的编译,只链接了目标文件。也许嘿没有更新?此外,链接器抱怨
rp_osc_meas_min_max内部的函数_rp_osc_adc_sign。实施了吗? -
@MByD Makefiles 有implicit rules。包括从
.c文件构建.o。 -
@IsmailBadawi
rp_osc_adc_sign在worker.c中定义 - 请参阅我的更新! -
@MByD
rp_osc_adc_sign在 worker.c 中定义 - 我刚刚编辑了我的帖子!
标签: c macos compilation linker