奇怪的未定义引用..错误
我正在尝试尝试一个定点数学库,我在维基百科上找到了并从Google 代码。
我尝试通过将以下 main.c 文件添加到其源代码并将整个文件重新编译为可执行文件来编译一个简单的示例项目。
问题
gcc(实际上正在使用代码块 v1.0)抱怨对函数的未定义引用,我真的认为该库定义了。 某些函数可以工作,其他函数会生成“未定义的引用错误”,例如,
这是我尝试添加到源文件中的 main.c 文件。
#include<stdio.h>
#include "fixmath.h"
int main()
{
float num1=6.25f;
float num2=2.567f;
fix16_t numfix1=fix16_from_float(num1);
fix16_t numfix2=fix16_from_float(num2);
//try out arithmetic on the fixed numbers
fix16_t simpleAdd= fix16_add(numfix1, numfix2);//(this works !!)no error
fix16_t product= fix16_smul(numfix1,numfix2);//undefined reference to 'fix16_smul'
fix16_t quotient=fix16_sdiv(numfix1,numfix2);//undefined reference to 'fix16_sdiv'
fix16_t sum=fix16_sadd(numfix1,numfix2);//undefined reference to 'fix16_sadd'
fix16_t difference=fix16_ssub(numfix1,numfix2);//undefined reference to ....
//print out the results
printf("the product of %f * %f =%f \n",num1,num2,fix16_to_float(product));
printf("the quotient of %f and %f =%f \n",num1,num2,fix16_to_float(quotient));
printf("the sum of %f + %f =%f \n",num1,num2,fix16_to_float(sum));
printf("the difference of %f - %f =%f \n",num1,num2,fix16_to_float(difference));
//system("pause")
printf("please press any key to continue ...\n");
getchar();
}
EDIT3:
//显示 makefile 和构建日志
//build log
Project : libfixmath
Compiler : GNU GCC Compiler (called directly)
Directory : C:\libfixmath\
--------------------------------------------------------------------------------
Switching to target: dbg
Linking console executable: fixmathexample.exe
obj\dbg\main.o: In function `main':
C:/libfixmath/main.c:14: undefined reference to `fix16_smul'
C:/libfixmath/main.c:15: undefined reference to `fix16_sdiv'
C:/libfixmath/main.c:16: undefined reference to `fix16_sadd'
obj\dbg\main.o: In function `fix16_ssub':
C:/libfixmath/fix16.h:51: undefined reference to `fix16_sadd'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
4 errors, 0 warnings
//导出的 make 文件
###############################################################################
# Makefile automatically generated by Code::Blocks IDE #
###############################################################################
# Project: libfixmath
# Project filename: C:\libfixmath\libfixmath.cbp
# Compiler used: GNU GCC Compiler
### Variables used in this Makefile
dbg_CC=mingw32-gcc.exe
dbg_CPP=mingw32-g++.exe
dbg_LD=mingw32-g++.exe
dbg_LIB=ar.exe
dbg_RESCOMP=windres.exe
rel_CC=mingw32-gcc.exe
rel_CPP=mingw32-g++.exe
rel_LD=mingw32-g++.exe
rel_LIB=ar.exe
rel_RESCOMP=windres.exe
### Compiler/linker options
dbg_GLOBAL_CFLAGS=
dbg_PROJECT_CFLAGS= -DFIXMATH_NO_CACHE -DFIXMATH_NO_64BIT
dbg_GLOBAL_LDFLAGS=
dbg_PROJECT_LDFLAGS=
dbg_GLOBAL_INCS= -IC:/Program\ Files/CodeBlocks/include
dbg_PROJECT_INCS=
dbg_GLOBAL_LIBDIRS= -LC:/Program\ Files/CodeBlocks/lib
dbg_PROJECT_LIBDIRS= -LC:/libfixmath/lib
dbg_GLOBAL_LIBS=
dbg_PROJECT_LIBS= C:\libfixmath\lib\libfixmath.a
rel_GLOBAL_CFLAGS=
rel_PROJECT_CFLAGS= -DFIXMATH_NO_CACHE -DFIXMATH_NO_64BIT
rel_GLOBAL_LDFLAGS=
rel_PROJECT_LDFLAGS=
rel_GLOBAL_INCS= -IC:/Program\ Files/CodeBlocks/include
rel_PROJECT_INCS=
rel_GLOBAL_LIBDIRS= -LC:/Program\ Files/CodeBlocks/lib
rel_PROJECT_LIBDIRS= -LC:/libfixmath/lib
rel_GLOBAL_LIBS=
rel_PROJECT_LIBS= C:\libfixmath\lib\libfixmath.a
### Targets compiler flags
dbg_CFLAGS= $(dbg_PROJECT_CFLAGS) -Wall -g $(dbg_GLOBAL_CFLAGS)
rel_CFLAGS= $(rel_PROJECT_CFLAGS) -fexpensive-optimizations -O3 -Wall -fomit-frame-pointer $(rel_GLOBAL_CFLAGS)
### Targets linker flags
dbg_LDFLAGS= $(dbg_PROJECT_LDFLAGS) $(dbg_GLOBAL_LDFLAGS)
rel_LDFLAGS= $(rel_PROJECT_LDFLAGS) -s $(rel_GLOBAL_LDFLAGS)
### Targets include directories
dbg_INCS= $(dbg_PROJECT_INCS) $(dbg_GLOBAL_INCS)
rel_INCS= $(rel_PROJECT_INCS) $(rel_GLOBAL_INCS)
### Targets library directories
dbg_LIBDIRS= $(dbg_PROJECT_LIBDIRS) $(dbg_GLOBAL_LIBDIRS)
rel_LIBDIRS= $(rel_PROJECT_LIBDIRS) $(rel_GLOBAL_LIBDIRS)
### Targets libraries
dbg_LIBS= $(dbg_PROJECT_LIBS) $(dbg_GLOBAL_LIBS)
rel_LIBS= $(rel_PROJECT_LIBS) $(rel_GLOBAL_LIBS)
###############################################################################
# You shouldn't need to modify anything beyond this point #
###############################################################################
### Resources used in this Makefile
dbg_RESOURCE=
### Objects used in this Makefile
dbg_OBJS=obj/dbg/main.o
dbg_LINKOBJS=$(dbg_OBJS)
dbg_DEPS=.deps/main.d
rel_OBJS=obj/rel/main.o
rel_LINKOBJS=$(rel_OBJS)
rel_DEPS=.deps/main.d
### The targets of this project
dbg_BIN=fixmathexample.exe
rel_BIN=fixmathexample
.PHONY: all all-before all-custom all-after clean clean-custom distclean distclean-custom depend_dbg dbg-before dbg-after depend_rel rel-before rel-after
all: all-before dbg rel all-after
dist:
@zip libfixmath.cbp.zip libfixmath.cbp Makefile Makefile fix16.c fix16.h fix16_exp.c fix16_sqrt.c fix16_trig.c fixmath.h fract32.c fract32.h int64.h main.c uint32.c uint32.h
clean_dbg:
@echo Cleaning target "dbg"...
@$(RM) $(dbg_BIN) $(dbg_OBJS) $(dbg_RESOURCE)
distclean_dbg:
@echo Dist-cleaning target "dbg"...
@$(RM) $(dbg_BIN) $(dbg_OBJS) $(dbg_DEPS) $(dbg_RESOURCE)
clean_rel:
@echo Cleaning target "rel"...
@$(RM) $(rel_BIN) $(rel_OBJS) $(rel_RESOURCE)
distclean_rel:
@echo Dist-cleaning target "rel"...
@$(RM) $(rel_BIN) $(rel_OBJS) $(rel_DEPS) $(rel_RESOURCE)
clean: clean_dbg clean_rel
distclean: distclean_dbg distclean_rel
depend_dbg_DIRS:
-@if not exist ".deps\." mkdir ".deps"
depend_dbg: depend_dbg_DIRS $(dbg_DEPS)
depend_rel_DIRS:
-@if not exist ".deps\." mkdir ".deps"
depend_rel: depend_rel_DIRS $(rel_DEPS)
depend: depend_dbg depend_rel
dbg_DIRS:
-@if not exist "obj\." mkdir "obj"
-@if not exist "obj\dbg\." mkdir "obj\dbg"
dbg: depend_dbg dbg_DIRS dbg-before $(dbg_BIN) dbg-after
$(dbg_BIN): $(dbg_LINKOBJS) $(dbg_RESOURCE)
@echo Linking executable "fixmathexample.exe"...
@$(dbg_LD) $(dbg_LIBDIRS) -o $(dbg_BIN) $(dbg_LINKOBJS) $(dbg_RESOURCE) $(dbg_LDFLAGS) $(dbg_LIBS)
rel_DIRS:
-@if not exist "obj\." mkdir "obj"
-@if not exist "obj\rel\." mkdir "obj\rel"
rel: depend_rel rel_DIRS rel-before $(rel_BIN) rel-after
$(rel_BIN): $(rel_LINKOBJS) $(rel_RESOURCE)
@echo Linking executable "fixmathexample"...
@$(rel_LD) $(rel_LIBDIRS) -o $(rel_BIN) $(rel_LINKOBJS) $(rel_RESOURCE) $(rel_LDFLAGS) $(rel_LIBS)
.deps/main.d: main.c
@echo Calculating dependencies for "main.c"...
@$(dbg_CC) -MM $(dbg_CFLAGS) -MF .deps/main.d -MT obj/dbg/main.o,obj/rel/main.o $(dbg_INCS) main.c
obj/dbg/main.o: .deps/main.d
@echo Compiling "main.c"...
@$(dbg_CC) $(dbg_CFLAGS) $(dbg_INCS) -c main.c -o obj/dbg/main.o
obj/rel/main.o: main.c
@echo Compiling "main.c"...
@$(rel_CC) $(rel_CFLAGS) $(rel_INCS) -c main.c -o obj/rel/main.o
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您确定已链接到该库吗?有效的可能是头文件中定义的内联函数,因此您拥有它们的定义,而其他函数的定义位于您需要链接的 .lib 文件中。
Are you sure you have linked to the library? Possibly the ones that work are inline functions defined in header files therefore you have their definitions, and the definitions of others are in the .lib file which you need to link against.
你是对的,库确实提供了这些,但是“未定义的引用”是一个链接器错误;您必须将库链接到编译后的目标代码。仅包含标头是不够的,它仅包含库提供的符号的声明。
我想 Code::Blocks 的项目管理器有一个用于指定附加库的条目。
fix16_add
在这种情况下可以工作,因为它在头文件中完全定义为inline
代码。You are right the library does provide these, but "undefined reference" is a linker error; you have to link the library to your compiled object code. Including the header alone is insufficient, that merely contains declarations of symbols provided by the library.
I imagine Code::Blocks' project manager has an entry for specifying additional libraries.
fix16_add
works in this case because it is fully defined asinline
code in the header file.