奇怪的未定义引用..错误

发布于 2024-11-15 15:01:49 字数 7415 浏览 5 评论 0 原文

我正在尝试尝试一个定点数学库,我在维基百科上找到了并从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

i am trying to experiment with a fixed point math library i found on wikipedia and downloaded it from google code.
I tried to compile a simple example project by adding the following main.c file to their source and recompiling the whole thing as an executable.

The problem
gcc (am actually using codeblocks v1.0) complains about undefined references to functions that i really think the library defines. Some functions work others generate 'undefined reference errors' eg,
here is my main.c file i tried to add to source files.

#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:
//show both makefile and build log

//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

//the exported make file

###############################################################################
# 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

清晨说晚安 2024-11-22 15:01:49

您确定已链接到该库吗?有效的可能是头文件中定义的内联函数,因此您拥有它们的定义,而其他函数的定义位于您需要链接的 .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.

阳光的暖冬 2024-11-22 15:01:49

你是对的,库确实提供了这些,但是“未定义的引用”是一个链接器错误;您必须将库链接到编译后的目标代码。仅包含标头是不够的,它仅包含库提供的符号的声明

我想 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 as inline code in the header file.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文