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