我在使用海思硬件接口的時候,用到了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/*