我在使用海思硬體接口的時候,用到了mpi庫,然後Makefile裡面連結了這個庫,但是編譯到了連結的時候報錯了:
./lib//libmpi.so: undefined reference to `sem_post'
./lib//libmpi.so: undefined reference to `snprintf_s'
./lib//libmpi.so: undefined reference to `sincos'
./lib//libmpi.so: undefined reference to `HI_DNVQE_ReadFrame'
./lib//libmpi.so: undefined reference to `HI_VOICE_EncodeFrame'
./lib//libmpi.so: undefined reference to `atan2'
./lib//libmpi.so: undefined reference to `HI_UPVQE_Create'
./lib//libmpi.so: undefined reference to `HI_UPVQE_SetVolume'
./lib//libmpi.so: undefined reference to `sem_trywait'
./lib//libmpi.so: undefined reference to `acos'
./lib//libmpi.so: undefined reference to `HI_UPVQE_GetVolume'
./lib//libmpi.so: undefined reference to `HI_VOICE_DecReset'
./lib//libmpi.so: undefined reference to `HI_DNVQE_WriteFrame'
./lib//libmpi.so: undefined reference to `HI_DNVQE_Create'
./lib//libmpi.so: undefined reference to `sin'
./lib//libmpi.so: undefined reference to `HI_UPVQE_Destroy'
./lib//libmpi.so: undefined reference to `HI_UPVQE_GetConfig'
./lib//libmpi.so: undefined reference to `sem_getvalue'
./lib//libmpi.so: undefined reference to `sem_wait'
./lib//libmpi.so: undefined reference to `HI_VOICE_EncReset'
./lib//libmpi.so: undefined reference to `sem_init'
./lib//libmpi.so: undefined reference to `HI_UPVQE_ReadFrame'
./lib//libmpi.so: undefined reference to `memcpy_s'
./lib//libmpi.so: undefined reference to `tan'
./lib//libmpi.so: undefined reference to `HI_UPVQE_WriteFrame'
./lib//libmpi.so: undefined reference to `memmove_s'
./lib//libmpi.so: undefined reference to `pthread_join'
./lib//libmpi.so: undefined reference to `HI_VOICE_DecodeFrame'
./lib//libmpi.so: undefined reference to `pthread_create'
./lib//libmpi.so: undefined reference to `pow'
./lib//libmpi.so: undefined reference to `round'
./lib//libmpi.so: undefined reference to `log10'
./lib//libmpi.so: undefined reference to `HI_DNVQE_GetConfig'
./lib//libmpi.so: undefined reference to `sqrt'
./lib//libmpi.so: undefined reference to `sem_destroy'
./lib//libmpi.so: undefined reference to `memset_s'
./lib//libmpi.so: undefined reference to `strncpy_s'
./lib//libmpi.so: undefined reference to `HI_DNVQE_Destroy'
這些信号相關的函數連結pthread庫,HI_*相關的接口去文檔查屬于哪個庫,或許我的檔案跟目前開發闆不比對,我連續找了三個沒找到,不過這麼火的晶片别人肯定也用過,是以方案一直接上網搜該函數;方案二我有一份上司給的頭檔案和庫檔案,我到整個頭檔案裡面能找到相應的函數,然後就去把名字差不多的庫檔案連結進去,果然編譯通過了。還有要特别注意的是基礎庫要靠右側。最後,strncpy_s等幾個函數海思有自己的實作,在庫libsecurec.so(或靜态庫libsecurec.a)裡面,這個基礎庫要靠右側放。
附上自己的Makefile吧,省得下次忘記了
CC = arm-himix200-linux-gcc
CCFLAGS = -Wall -O -g
INCLUDE = -I ./include
# 可執行檔案的名字
TARGET = encJpeg
# 連結 libmpi.a等庫檔案
LIBPATH = -L ./lib/
LIBNAME = -lmpi -live -lupvqe -ldnvqe -lVoiceEngine -lpthread -lsecurec
#正規表達式表示目錄下所有.c檔案,
C_SRCS= $(wildcard ./src/*.c)
# 第一行依賴關系:冒号後面為依賴的檔案
# 第二行規則:$@表示目标檔案,$^表示所有依賴檔案,$<表示第一個依賴檔案
$(TARGET): $(C_SRCS)
$(CC) $(CCFLAGS) $(INCLUDE) $(LIBPATH) $(LIBNAME) -o ./build/$@ $^
# make clean删除所有.o和目标檔案
clean:
rm -f ./build/*