为什么 aarch64-linux-gnu/bin/ld 找不到明明存在的 lpaho-mqtt3a?
Why can't aarch64-linux-gnu/bin/ld find - lpaho-mqtt3a which clearly exists?
我交叉编译了paho-mqtt3a的库,之前是正常的。我在 /usr/lib/ 和 /usr/local/lib 目录中有相应的库,我检查了库的详细信息文件命令。但是为什么今天 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
共享动态库:
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)
解决了。
我使用选项 -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)
我交叉编译了paho-mqtt3a的库,之前是正常的。我在 /usr/lib/ 和 /usr/local/lib 目录中有相应的库,我检查了库的详细信息文件命令。但是为什么今天 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
共享动态库:
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)
解决了。 我使用选项 -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)