Any suggestion regarding the following query would be appreciated. I have tried everything and am still struck with this error. The library (FastPFor) works fine with the visual studio solution; the issue arises when I try to use it with my project containing the file (src/example.cpp).
I am trying to link the static library (lib/FastPFor/libFastPFOR.a) to my example.cpp. I have copied the header files in the (include/FastPFor/*h) while I obtained FastPForlib.a by running the CMake
command followed by make
, on Ubuntu run via WSL.
Following is my dependency-tree
example (proj)
include
------------>FastPFor
--------------------->*h
lib
------------>FastPFor
--------------------->liblibFastPFor.a
src
------------>example.src
Makefile
Following is my makefile:
.SUFFIXES:
#
.SUFFIXES: .cpp .o .c .h
LDFLAGS = -Llib/FastPFor -llibFastPFOR
# replace the CXX variable with a path to a C 11 compatible compiler.
# to build an aligned version, add -DUSE_ALIGNED=1
ifeq ($(INTEL), 1)
# if you wish to use the Intel compiler, please do "make INTEL=1".
CXX ?= /opt/intel/bin/icpc
CC ?= /opt/intel/bin/icpc
ifeq ($(DEBUG),1)
CXXFLAGS = -fpic -std=c 11 -O3 -Wall -ansi -xAVX -DDEBUG=1 -D_GLIBCXX_DEBUG -ggdb
CCFLAGS = -fpic -std=c99 -O3 -Wall -ansi -xAVX -DDEBUG=1 -D_GLIBCXX_DEBUG -ggdb
else
CXXFLAGS = -fpic -std=c 11 -O2 -Wall -ansi -xAVX -DNDEBUG=1 -ggdb
CCFLAGS = -fpic -std=c99 -O2 -Wall -ansi -xAVX -DNDEBUG=1 -ggdb
endif # debug
else #intel
CXX ?= g -4.7
ifeq ($(DEBUG),1)
CXXFLAGS = -fpic -mavx -std=c 11 -Weffc -pedantic -ggdb -DDEBUG=1 -D_GLIBCXX_DEBUG -Wall -Wextra -Wextra -Wsign-compare -Wwrite-strings -Wpointer-arith -Winit-self -Wno-sign-conversion
CCFLAGS = -fpic -mavx -std=c99 -pedantic -ggdb -DDEBUG=1 -D_GLIBCXX_DEBUG -Wall -Wextra -Wsign-compare -Wwrite-strings -Wpointer-arith -Winit-self -Wno-sign-conversion
else
CXXFLAGS = -fpic -mavx -std=c 11 -Weffc -pedantic -O3 -Wall -Wextra -Wsign-compare -Wwrite-strings -Wpointer-arith -Winit-self -Wno-sign-conversion
CCFLAGS = -fpic -mavx -std=c99 -pedantic -O3 -Wall -Wextra -Wsign-compare -Wwrite-strings -Wpointer-arith -Winit-self -Wno-sign-conversion
endif #debug
endif #intel
HEADERS= $(shell ls include/FastPFor/*.h)
all: example
example: $(HEADERS) src/example.cpp
$(CXX) $(CXXFLAGS) -o example $(LDFLAGS) src/example.cpp
clean:
rm -f *.o example
astyle:
astyle --options=astyle.conf --recursive "*.cpp" "*.h"
.PHONY: all clean astyle
Running make
produced bunch of errors, all related to undefined reference to FastPFOR.
It looks something like following:
/usr/bin/ld: example.cpp:(.text._ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm[_ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm] 0x781): undefined reference to `__fastunpack11(unsigned int const*, unsigned long*)'
/usr/bin/ld: example.cpp:(.text._ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm[_ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm] 0x791): undefined reference to `__fastunpack10(unsigned int const*, unsigned long*)'
/usr/bin/ld: example.cpp:(.text._ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm[_ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm] 0x7a1): undefined reference to `__fastunpack9(unsigned int const*, unsigned long*)'
/usr/bin/ld: example.cpp:(.text._ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm[_ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm] 0x7b1): undefined reference to `__fastunpack4(unsigned int const*, unsigned long*)'
/usr/bin/ld: example.cpp:(.text._ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm[_ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm] 0x7c1): undefined reference to `__fastunpack3(unsigned int const*, unsigned long*)'
/usr/bin/ld: example.cpp:(.text._ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm[_ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm] 0x7d1): undefined reference to `__fastunpack64(unsigned int const*, unsigned long*)'
/usr/bin/ld: example.cpp:(.text._ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm[_ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm] 0x7e1): undefined reference to `__fastunpack8(unsigned int const*, unsigned long*)'
/usr/bin/ld: example.cpp:(.text._ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm[_ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm] 0x7f1): undefined reference to `__fastunpack7(unsigned int const*, unsigned long*)'
/usr/bin/ld: example.cpp:(.text._ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm[_ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm] 0x801): undefined reference to `__fastunpack6(unsigned int const*, unsigned long*)'
/usr/bin/ld: example.cpp:(.text._ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm[_ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm] 0x811): undefined reference to `__fastunpack5(unsigned int const*, unsigned long*)'
/usr/bin/ld: example.cpp:(.text._ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm[_ZN11FastPForLib12FastPForImplILj8EmE13__decodeArrayEPKjRmPmm] 0x87c): undefined reference to `__fastunpack2(unsigned int const*, unsigned long*)'
collect2: error: ld returned 1 exit status
make: *** [Makefile:36: example] Error 1
Thank you in advance.
CodePudding user response:
First please always include the command (in this case, link line) that make printed out before you got your errors, when asking questions.
The problem is the order in which you have things on the link line. -llibFastPFOR
is not an option per se, it tells the linker to look at that file and include any symbols that are needed but are currently undefined. But since you put this first on your link line, before example.cpp
, there are no symbols (other than main
) that are needed yet.
You have to put the source (and object) files first on the link line, before the libraries. So change your linker command to:
$(CXX) $(CXXFLAGS) -o example src/example.cpp $(LDFLAGS)
This is not a very standard/well-behaved makefile in a lot of ways, but this change should solve your immediate problem.