linux - 为什么 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)
解决方案
解决了。我使用选项-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)
推荐阅读
- node.js - Sequelize hasMany 和 belongsTo 在同一个关联中
- javascript - 在 html 文件中打印 exim 邮件队列
- typescript - Typescript:如何将类型的属性过滤为特定类型的属性?
- laravel - 如何从 Laravel 的特定会话中注销用户?
- multithreading - 带有 FFTW 的 fftwf_plan_dft_1d( ... ) 无法执行
- haproxy - Filebeat 无法通过 haproxy 将日志发送到 logzio
- c# - 访问异步调用的结果是否使其同步?
- excel - (Excel VBA)插入复选框(OKAY)并将它们链接到单独工作表中的单元格(不是OKAY)
- asp.net - 对于 asp.net 应用程序,单个 iis 托管 2 个应用程序的不同会话 ID
- android - 如何让第三方应用程序(Gmail/Email/Message/WhatsApp)回复我们的应用程序