Я перекрестно скомпилировал библиотеку 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
ЛС /USR/локальные/библиотеки/
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: Измените make-файл в соответствии с советом Бодо.
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)
@Bodo Я добавил *.so и *. библиотеки, которые я использовал для компиляции. Я предполагаю, что это причина того, что динамические библиотеки и статические библиотеки компилируются вместе? И как компилировать?
решил это. Я использую опцию -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)
Компоновщик ищет библиотеки в
/usr/local/lib
? Может стоит добавить-L/usr/local/lib
? Кстати: вашMakefile
содержит несколько проблем. Почему вы перемещаете все объекты в$(OUTPUT_DIR)
вместо того, чтобы использовать их напрямую. Это приводит к перекомпиляции объектов и исполняемого файла при каждом запускеmake
, даже если исходный файл не изменился. Правило для цели$(TARGET)
должно строиться именно$(TARGET)
, а не$(OUTPUT_DIR)/$(TARGET)
. См., например. make.mad-scientist.net/papers/rules-of-makefiles и другие статьи на этом сайте.