0
votes

I am trying to compile my source code from Windows to Ubuntu system using OpenCL libraries. I can confirm that the OpenCL library was successfully installed at /usr/lib/x86_64-linux-gnu/libOpenCL.so

When I make release I get "undefined reference to" despite the fact I linked the OpenCL file which is located at /usr/lib/x86_64-linux-gnu/libOpenCL.so.

I come from Visual Studio world so all I did accordingly was to add in the original makefile the path of the library using -L parameters for DYN_RELEASE_LIBS and STAT_RELEASE_LIBS variables.

user75@server:~/source/build/linux$ make release
make -C lib/TLibVideoIO              release MM32=0
make[1]: Entering directory `/home/user75/source/build/linux/lib/TLibVideoIO'
make[1]: Leaving directory `/home/user75/source/build/linux/lib/TLibVideoIO'
make -C lib/TLibCommon               release MM32=0
make[1]: Entering directory `/home/user75/source/build/linux/lib/TLibCommon'
make[1]: Leaving directory `/home/user75/source/build/linux/lib/TLibCommon'
make -C lib/TLibDecoder              release MM32=0
make[1]: Entering directory `/home/user75/source/build/linux/lib/TLibDecoder'
make[1]: Leaving directory `/home/user75/source/build/linux/lib/TLibDecoder'
make -C lib/TLibEncoder              release MM32=0
make[1]: Entering directory `/home/user75/source/build/linux/lib/TLibEncoder'
make[1]: Leaving directory `/home/user75/source/build/linux/lib/TLibEncoder'
make -C lib/TAppCommon               release MM32=0
make[1]: Entering directory `/home/user75/source/build/linux/lib/TAppCommon'
make[1]: Leaving directory `/home/user75/source/build/linux/lib/TAppCommon'
make -C app/TAppDecoder              release MM32=0
make[1]: Entering directory `/home/user75/source/build/linux/app/TAppDecoder'
make[1]: Leaving directory `/home/user75/source/build/linux/app/TAppDecoder'
make -C app/TAppEncoder              release MM32=0
make[1]: Entering directory `/home/user75/source/build/linux/app/TAppEncoder'
g++-4.8 -o ../../../../bin/Linux/TAppEncoderStatic -Wall  ./objects/encmain.r.o ./objects/TAppEncCfg.r.o ./objects/TAppEncTop.r.o -L../../../../lib /usr/lib/x86_64-linux-gnu/libOpenCL.so -ldl  -lpthread  -lTLibEncoderStatic -lTLibCommonStatic -lTLibVideoIOStatic -lTAppCommonStatic -L/usr/lib/x86_64-linux-gnu/libOpenCL.so
../../../../lib/libTLibEncoderStatic.a(TEncTop.r.o): In function `TEncTop::xInitOpenCL(int)':
TEncTop.cpp:(.text+0x4264): undefined reference to `TEncOpenCL::findDevice(int)'
TEncTop.cpp:(.text+0x4285): undefined reference to `TEncOpenCL::compileOneKernelSource(char const*, char const*)'
TEncTop.cpp:(.text+0x42e3): undefined reference to `TEncOpenCL::setCTUs_and_SearchRange(unsigned int, unsigned int, int)'
../../../../lib/libTLibEncoderStatic.a(TEncTop.r.o): In function `TEncTop::TEncTop()':
TEncTop.cpp:(.text+0x5597): undefined reference to `TEncOpenCL::TEncOpenCL()'
TEncTop.cpp:(.text+0x58fc): undefined reference to `TEncOpenCL::~TEncOpenCL()'
../../../../lib/libTLibEncoderStatic.a(TEncTop.r.o): In function `TEncTop::~TEncTop()':
TEncTop.cpp:(.text+0x5b74): undefined reference to `TEncOpenCL::~TEncOpenCL()'
TEncTop.cpp:(.text+0x5d47): undefined reference to `TEncOpenCL::~TEncOpenCL()'
../../../../lib/libTLibEncoderStatic.a(TEncSearch.r.o): In function `TEncSearch::xMotionEstimation(TComDataCU*, TComYuv*, int, RefPicList, TComMv*, int, TComMv&, unsigned int&, unsigned int&, TComMv (*) [33][593], unsigned int (*) [33][593], bool, unsigned long, bool)':
TEncSearch.cpp:(.text+0xf28d): undefined reference to `TEncOpenCL::calcMotionVectors(short*, short*, int, int, int, TComMv*, unsigned long, int)'
TEncSearch.cpp:(.text+0xf46f): undefined reference to `TEncOpenCL::FreeMemory(int)'
../../../../lib/libTLibEncoderStatic.a(TEncSearch.r.o): In function `TEncSearch::xMotionEstimation(TComDataCU*, TComYuv*, int, RefPicList, TComMv*, int, TComMv&, unsigned int&, unsigned int&, TComMv (*) [33][593], unsigned int (*) [33][593], bool, unsigned long, bool) [clone .constprop.186]':
TEncSearch.cpp:(.text+0xfd32): undefined reference to `TEncOpenCL::calcMotionVectors(short*, short*, int, int, int, TComMv*, unsigned long, int)'
TEncSearch.cpp:(.text+0xff39): undefined reference to `TEncOpenCL::FreeMemory(int)'
collect2: error: ld returned 1 exit status
make[1]: *** [../../../../bin/Linux/TAppEncoderStatic] Error 1
make[1]: Leaving directory `/home/user75/source/build/linux/app/TAppEncoder'
make: *** [release] Error 2

Makefile source code is below. The changes I did were at USER_LIB_DIRS and DYN_RELEASE_LIBS and STAT_RELEASE_LIBS variables.

# the SOURCE definiton lets you move your makefile to another position
CONFIG              = CONSOLE

# set directories to your wanted values
SRC_DIR             = ../../../../source/App/TAppEncoder
INC_DIR             = ../../../../source/Lib
LIB_DIR             = ../../../../lib
BIN_DIR             = ../../../../bin

SRC_DIR1        =
SRC_DIR2        =
SRC_DIR3        =
SRC_DIR4        =

USER_INC_DIRS   = -I$(SRC_DIR)
USER_LIB_DIRS   = /usr/lib/x86_64-linux-gnu/libOpenCL.so

ifeq ($(HIGHBITDEPTH), 1)
HBD=HighBitDepth
else
HBD=
endif

# intermediate directory for object files
OBJ_DIR             = ./objects$(HBD)

# set executable name
PRJ_NAME            = TAppEncoder$(HBD)

# defines to set
DEFS                = -DMSYS_LINUX -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -DMSYS_UNIX_LARGEFILE

# set objects
OBJS                =   \
                    $(OBJ_DIR)/encmain.o \
                    $(OBJ_DIR)/TAppEncCfg.o \
                    $(OBJ_DIR)/TAppEncTop.o \

# set libs to link with
LIBS                = -ldl

DEBUG_LIBS          =
RELEASE_LIBS        =

STAT_LIBS           = -lpthread 
DYN_LIBS            =


DYN_DEBUG_LIBS      = -lTLibEncoder$(HBD)d -lTLibCommon$(HBD)d -lTLibVideoIO$(HBD)d -lTAppCommon$(HBD)d
DYN_DEBUG_PREREQS       = $(LIB_DIR)/libTLibEncoder$(HBD)d.a $(LIB_DIR)/libTLibCommon$(HBD)d.a $(LIB_DIR)/libTLibVideoIO$(HBD)d.a $(LIB_DIR)/libTAppCommon$(HBD)d.a
STAT_DEBUG_LIBS     = -lTLibEncoder$(HBD)Staticd -lTLibCommon$(HBD)Staticd -lTLibVideoIO$(HBD)Staticd -lTAppCommon$(HBD)Staticd
STAT_DEBUG_PREREQS      = $(LIB_DIR)/libTLibEncoder$(HBD)Staticd.a $(LIB_DIR)/libTLibCommon$(HBD)Staticd.a $(LIB_DIR)/libTLibVideoIO$(HBD)Staticd.a $(LIB_DIR)/libTAppCommon$(HBD)Staticd.a

DYN_RELEASE_LIBS    = -lTLibEncoder$(HBD) -lTLibCommon$(HBD) -lTLibVideoIO$(HBD) -lTAppCommon$(HBD) -l/usr/lib/x86_64-linux-gnu/libOpenCL.so 
DYN_RELEASE_PREREQS = $(LIB_DIR)/libTLibEncoder$(HBD).a $(LIB_DIR)/libTLibCommon$(HBD).a $(LIB_DIR)/libTLibVideoIO$(HBD).a $(LIB_DIR)/libTAppCommon$(HBD).a
STAT_RELEASE_LIBS   = -lTLibEncoder$(HBD)Static -lTLibCommon$(HBD)Static -lTLibVideoIO$(HBD)Static -lTAppCommon$(HBD)Static -l/usr/lib/x86_64-linux-gnu/libOpenCL.so 
STAT_RELEASE_PREREQS    = $(LIB_DIR)/libTLibEncoder$(HBD)Static.a $(LIB_DIR)/libTLibCommon$(HBD)Static.a $(LIB_DIR)/libTLibVideoIO$(HBD)Static.a $(LIB_DIR)/libTAppCommon$(HBD)Static.a

ifeq ($(EXTENSION_360_VIDEO), 1)
  DYN_DEBUG_LIBS      += -lTAppEncHelper360$(HBD)d -lTLib360$(HBD)d
  DYN_DEBUG_PREREQS   += $(LIB_DIR)/libTAppEncHelper360$(HBD)d.a $(LIB_DIR)/libTLib360$(HBD)d.a
  STAT_DEBUG_LIBS     += -lTAppEncHelper360$(HBD)Staticd -lTLib360$(HBD)Staticd
  STAT_DEBUG_PREREQS  += $(LIB_DIR)/libTAppEncHelper360$(HBD)Staticd.a $(LIB_DIR)/libTLib360$(HBD)Staticd.a
  DYN_RELEASE_LIBS    += -lTAppEncHelper360$(HBD) -lTLib360$(HBD)
  DYN_RELEASE_PREREQS += $(LIB_DIR)/libTAppEncHelper360$(HBD).a $(LIB_DIR)/libTLib360$(HBD).a
  STAT_RELEASE_LIBS   += -lTAppEncHelper360$(HBD)Static -lTLib360$(HBD)Static
  STAT_RELEASE_PREREQS+= $(LIB_DIR)/libTAppEncHelper360$(HBD)Static.a $(LIB_DIR)/libTLib360$(HBD)Static.a
endif

# name of the base makefile
MAKE_FILE_NAME      = ../../common/makefile.base

# include the base makefile
include $(MAKE_FILE_NAME)

So, the questions are 1) is this a link error? 2) how to add the *.so library successfully?

Regards,

1

1 Answers

0
votes

shared library should be added as

LDFLAGS += -L/usr/lib/x86_64-linux-gnu/libOpenCL.so
LDLIBS += -lOpenCL