首页 > 解决方案 > 为什么 aarch64-linux-gnu/bin/ld 找不到明显存在的 lpaho-mqtt3a?

问题描述

我交叉编译了paho-mqtt3a的库,之前是正常的。我在/usr/lib//usr/local/lib目录中有相应的库,并使用file命令检查了库的详细信息。但是为什么今天 aarch64-linux-gnu/bin/ld找不到 paho-mqtt3a 库呢?我使用这些库:

paho-mqtt3a.so  libjson-c.a  libjson-c.la libsqlite3.so libsqlite3.la libsqlite3.a srs_librtmp.a libssl.a libcrypto.a 

犯错误:

aarch64-linux-gnu-gcc -c ./src/main.c
aarch64-linux-gnu-gcc -c ./src/ec_uart_232.c
aarch64-linux-gnu-gcc -c ./src/ec_uart_485.c
aarch64-linux-gnu-gcc -c ./src/ec_manage_plce.c
aarch64-linux-gnu-gcc -c ./src/ec_socket_video.c
aarch64-linux-gnu-gcc -c ./src/ec_mqtt_android.c
aarch64-linux-gnu-gcc -c ./src/ec_sqlite.c
aarch64-linux-gnu-gcc -c ./src/ec_store_info.c
aarch64-linux-gnu-gcc -c ./src/ec_manage_camera.c
aarch64-linux-gnu-gcc -c ./src/deal_request_loop.c
aarch64-linux-gnu-gcc -c ./src/push_video.c
aarch64-linux-gnu-gcc -o ./output/ecSmartFire main.o ec_uart_232.o 
ec_uart_485.o ec_manage_plce.o ec_socket_video.o ec_mqtt_android.o 
ec_sqlite.o ec_store_info.o ec_manage_camera.o deal_request_loop.o 
push_video.o  -O2 -Wall -Wcomment -Wformat -Wmissing-braces -Wswitch - 
Wuninitialized -Wbad-function-cast -Waggregate-return -Wmultichar -Wsign- 
compare -Wshadow -lpthread   \
    -lpaho-mqtt3a -ljson-c -lsqlite3 -ldl -lm ./lib/srslibrtmp_lib/* - 
  lstdc++ -static
/usr/lib/gcc-cross/aarch64-linux-gnu/8/../../../../aarch64-linux- 
gnu/bin/ld: cannot find -lpaho-mqtt3a
/usr/lib/gcc-cross/aarch64-linux-gnu/8/../../../../aarch64-linux- 
gnu/bin/ld: /usr/lib/../lib/libsqlite3.a(sqlite3.o): in function 
`unixDlOpen':/data/sqlite-autoconf-3310100/sqlite- 
autoconf3310100/sqlite3.c:39688: 
warning: Using 'dlopen' in statically linked applications requires at 
runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc-cross/aarch64-linux-gnu/8/../../../../aarch64-linux- 
gnu/bin/ld: ./lib/srslibrtmp_lib/srs_librtmp.a(srs_lib_simple_socket.o): 
in function `srs_hijack_io_connect(void*, char const*, int)':
/data/srs-3.0release/trunk/src/libs/srs_lib_simple_socket.cpp:157: 
warning: Using 'getaddrinfo' in statically linked applications requires at 
runtime the shared libraries from the glibc version used for linking
collect2: error: ld returned 1 exit status
make: *** [Makefile:49: ecSmartFire] Error 1

ls /usr/local/lib/

libavcodec.so             libavformat.so.58         libpaho-mqtt3as.so      libpostproc.so.55         
libswscale.so
libavcodec.so.58          libavformat.so.58.45.100  libpaho-mqtt3as.so.1    
libpostproc.so.55.7.100   libswscale.so.5
libavcodec.so.58.91.100   libavutil.so              libpaho-mqtt3as.so.1.0  libsqlite3.a              
libswscale.so.5.7.100
libavdevice.so            libavutil.so.56           libpaho-mqtt3c.so       libsqlite3.la             
libx264.a
libavdevice.so.58         libavutil.so.56.51.100    libpaho-mqtt3c.so.1     libsqlite3.so             
libx264.so
libavdevice.so.58.10.100  libjson-c.a               libpaho-mqtt3c.so.1.0   libsqlite3.so.0           
libx264.so.157
libavfilter.so            libjson-c.la              libpaho-mqtt3cs.so      libsqlite3.so.0.8.6       
pkgconfig
libavfilter.so.7          libpaho-mqtt3a.so         libpaho-mqtt3cs.so.1    libswresample.so          
python2.7
libavfilter.so.7.85.100   libpaho-mqtt3a.so.1       libpaho-mqtt3cs.so.1.0  libswresample.so.3        
python3.7
libavformat.so            libpaho-mqtt3a.so.1.0     libpostproc.so          
libswresample.so.3.7.100

文件 /usr/local/lib/libpaho-mqtt3a.so:

/usr/local/lib/libpaho-mqtt3a.so: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), 
dynamically linked, BuildID[sha1]=0b2cb59c2acdce0c1304c62f8f3a245a588cbe18, with debug_info, not 
stripped

共享动态库:</p>

ldconfig

makefile:根据 Bodo 的建议更改 makefile。

CC                         = aarch64-linux-gnu-gcc
STRIP                      = aarch64-linux-gnu-strip

CFLAGS_FORMAT              = -O2 -Wall -Wcomment -Wformat -Wmissing-braces -Wswitch 
-Wuninitialized  -Wbad-function-cast -Waggregate-return -Wmultichar -Wsign-compare -Wshadow
CFLAGS_STANDARD            = -lpthread 
##CFLAGS_DEBUG               = -gdwarf-2 -g  
CFLAGS_DEBUG               = 
CFLAGS_OTHERS_LIB          = -lpaho-mqtt3a -ljson-c -lsqlite3 -ldl -lm

CFLAGS_SRS_RTMP            = -lstdc++ -static

LIB_FOR_JSON       = ./lib/json_lib/*
LIB_FOR_MQTT       = ./lib/mqtt_lib/*
LIB_FOR_SQLITE3    = ./lib/sqlite3_lib/*
LIB_FOR_SRS        = ./lib/srslibrtmp_lib/*

SRC_DIR              = ./src
OUTPUT_DIR           = ./output
SYS_LOCAL_LIB_DIR          = /usr/local/lib


OBJS_MAIN                  = main.o
OBJS_EC_UART_232           = ec_uart_232.o
OBJS_EC_UART_485           = ec_uart_485.o
OBJS_EC_MANAGE_PLCE        = ec_manage_plce.o
OBJS_EC_SOCKET_VIDEO       = ec_socket_video.o
OBJS_EC_MQTT_ANDROID       = ec_mqtt_android.o
OBJS_EC_SQLITE             = ec_sqlite.o
OBJS_EC_STORE_INFO         = ec_store_info.o
OBJS_EC_MANAGE_CAMERA      = ec_manage_camera.o
OBJS_DEAL_REQUEST_LOOP     = deal_request_loop.o
OBJS_PUSH_VIDEO            = push_video.o

TARGET   = ecSmartFire
RM       = rm -rf 
MV       = mv 
CP       = cp -r
LDCONFIG  = ldconfig

OBJS    = $(OBJS_MAIN) $(OBJS_EC_UART_232) $(OBJS_EC_UART_485) $(OBJS_EC_MANAGE_PLCE) 
$(OBJS_EC_SOCKET_VIDEO) \
    $(OBJS_EC_MQTT_ANDROID) $(OBJS_EC_SQLITE) $(OBJS_EC_STORE_INFO) $(OBJS_EC_MANAGE_CAMERA) 
$(OBJS_DEAL_REQUEST_LOOP) \
    $(OBJS_PUSH_VIDEO)
                         


$(TARGET):$(OBJS)
    $(CC) -o $(OUTPUT_DIR)/$(TARGET) $(OBJS)  $(CFLAGS_FORMAT) $(CFLAGS_STANDARD) 
    $(CFLAGS_DEBUG) $(CFLAGS_OTHERS_LIB) $(LIB_FOR_SRS) $(CFLAGS_SRS_RTMP)
    $(STRIP) $(OUTPUT_DIR)/$(TARGET)

$(OBJS_MAIN):
    $(CC) -c $(SRC_DIR)/main.c
$(OBJS_EC_UART_232):
    $(CC) -c $(SRC_DIR)/ec_uart_232.c
$(OBJS_EC_UART_485):
    $(CC) -c $(SRC_DIR)/ec_uart_485.c
$(OBJS_EC_MANAGE_PLCE):
    $(CC) -c $(SRC_DIR)/ec_manage_plce.c 
$(OBJS_EC_SOCKET_VIDEO):
    $(CC) -c $(SRC_DIR)/ec_socket_video.c 
$(OBJS_EC_MQTT_ANDROID):
    $(CC) -c $(SRC_DIR)/ec_mqtt_android.c 
$(OBJS_EC_SQLITE):
    $(CC) -c $(SRC_DIR)/ec_sqlite.c 
$(OBJS_EC_STORE_INFO):
    $(CC) -c $(SRC_DIR)/ec_store_info.c 
$(OBJS_EC_MANAGE_CAMERA):
    $(CC) -c $(SRC_DIR)/ec_manage_camera.c
$(OBJS_DEAL_REQUEST_LOOP):
    $(CC) -c $(SRC_DIR)/deal_request_loop.c
$(OBJS_PUSH_VIDEO):
    $(CC) -c $(SRC_DIR)/push_video.c  

.PHONY:clean
clean:
   -$(RM) $(OUTPUT_DIR)/* $(OBJS)
copylib:
    $(CP) $(LIB_FOR_MQTT) $(SYS_LOCAL_LIB_DIR)/
    $(CP) $(LIB_FOR_JSON) $(SYS_LOCAL_LIB_DIR)/
    $(CP) $(LIB_FOR_SQLITE3) $(SYS_LOCAL_LIB_DIR)/
    $(LDCONFIG)

标签: linuxmakefilemqtt

解决方案


解决了。我使用选项-Wl ,-Bstatic和-Wl ,-Bdynamic来分离静态库和动态库。

$(TARGET):$(OBJS)
$(CC)  -L $(LIB_FOR_SRS) -o $(OUTPUT_DIR)/$(TARGET)  $(OBJS) -Wl,-Bstatic -lssl - 
lcrypto  \
-Wl,-Bdynamic $(DYNAMIC_LINK_OPTION) $(STATIC_LINK_OPTION) 
$(STRIP) $(OUTPUT_DIR)/$(TARGET)

推荐阅读