【发布时间】:2020-12-22 10:44:20
【问题描述】:
我交叉编译了paho-mqtt3a的库,之前是正常的。我在 /usr/lib/ 和 /usr/local/lib 目录中有相应的库,我用 file em> 命令。但是为什么 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)
【问题讨论】:
-
链接器是否在
/usr/local/lib中查找库?也许您必须添加-L/usr/local/lib?顺便说一句:您的Makefile包含一些问题。为什么将所有对象都移动到$(OUTPUT_DIR)而不是直接使用它们。这会导致每次运行make时都重新编译对象和可执行文件,即使没有更改源文件也是如此。目标$(TARGET)的规则应该完全构建$(TARGET),而不是$(OUTPUT_DIR)/$(TARGET)。参见例如make.mad-scientist.net/papers/rules-of-makefiles 和本站的其他论文。 -
@Bodo 我添加了 *.so 和 *.我用来编译的库。我想这就是动态库和静态库一起编译的原因?以及如何编译?