【问题标题】:How to compiling static libwebscocket.a如何编译静态 libwebscocket.a
【发布时间】:2019-05-23 09:57:51
【问题描述】:

我会使用 libwebsockets.a 而不是 libwebsocket.so 来编译我的应用程序 但我有一些问题。 我认为缺少链接,但我没有找到缺少的库。

我的代码与 Raspian Jessie 一起在 Raspberry Pi 上编译和工作,但我希望我的代码在其他发行版上也能工作。 为此,我想在我的应用程序中集成 libwebsocket。 将我使用的 libwebsocket.so 切换到 libwebsocket.a(切换到静态库)

我将 libwebsockets.h 和 .a 添加到文件夹中。添加指向该文件夹的链接(对于库 -L../FW_Shared/lib/libwebsockets 和包含 -I../FW_Shared/websockets/include)

对不起,我的 Raspbien 是法语

EX :    ../FW_Shared/lib/libwebsockets/libwebsockets.a(libwebsockets_la-libwebsockets.o) : In function « libwebsocket_context_destroy » :
    (.text+0x1414) :undefined reference to « ERR_free_strings »

    ../FW_Shared/lib/libwebsockets/libwebsockets.a(libwebsockets_la-libwebsockets.o) : Dans la fonction « libwebsocket_context_destroy » :
    (.text+0x1414) : référence indéfinie vers « ERR_free_strings »
    ../FW_Shared/lib/libwebsockets/libwebsockets.a(libwebsockets_la-libwebsockets.o) : Dans la fonction « libwebsocket_context_destroy » :
    (.text+0x1418) : référence indéfinie vers « EVP_cleanup »
    ../FW_Shared/lib/libwebsockets/libwebsockets.a(libwebsockets_la-libwebsockets.o) : Dans la fonction « libwebsocket_context_destroy » :
    (.text+0x141c) : référence indéfinie vers « CRYPTO_cleanup_all_ex_data »
    ../FW_Shared/lib/libwebsockets/libwebsockets.a(libwebsockets_la-libwebsockets.o) : Dans la fonction « libwebsocket_create_context » :
    (.text+0x1f30) : référence indéfinie vers « SSL_library_init »
    ../FW_Shared/lib/libwebsockets/libwebsockets.a(libwebsockets_la-libwebsockets.o) : Dans la fonction « libwebsocket_create_context » :
    (.text+0x1f34) : référence indéfinie vers « OPENSSL_add_all_algorithms_noconf »
    ../FW_Shared/lib/libwebsockets/libwebsockets.a(libwebsockets_la-libwebsockets.o) : Dans la fonction « libwebsocket_create_context » :
    (.text+0x1f38) : référence indéfinie vers « SSL_load_error_strings »
    ../FW_Shared/lib/libwebsockets/libwebsockets.a(libwebsockets_la-libwebsockets.o) : Dans la fonction « libwebsocket_create_context » :
    (.text+0x1f58) : référence indéfinie vers « SSL_get_ex_new_index »
    ../FW_Shared/lib/libwebsockets/libwebsockets.a(libwebsockets_la-libwebsockets.o) : Dans la fonction « libwebsocket_create_context » :
    (.text+0x1f68) : référence indéfinie vers « SSLv23_server_method »
    ../FW_Shared/lib/libwebsockets/libwebsockets.a(libwebsockets_la-libwebsockets.o) : Dans la fonction « libwebsocket_create_context » :
    (.text+0x2208) : référence indéfinie vers « SSLv23_client_method »

我的 Makefile :

READER =        Reader
ROOT_DIR =      .
PROJ_DIR =      $(ROOT_DIR)/src
LIB_DIR =       $(ROOT_DIR)/lib
INC_DIR =       $(ROOT_DIR)/include
OUT_DIR =       $(ROOT_DIR)/bin

NAME = TestServer
# CC = arm-linux-gnueabi-gcc
CC = arm-linux-gnueabihf-gcc

CFLAGS =  -DNUR_EXPOSE_WIN32API -std=gnu99 -DNUR_MODULE -pedantic -W -Wall

SRC =   $(PROJ_DIR)/testServer.c    \
    $(PROJ_DIR)/mtTestVersion.c \
    $(PROJ_DIR)/mtTestQueue.c   \
    $(PROJ_DIR)/mtTestJsonFormat.c  \
    $(PROJ_DIR)/mtTestWebSocket.c

OBJ= $(SRC:.c=.o)


LIBS = -L../FW_Shared/tools/lib/ -L../FW_Shared/lib/liblog4c/ -L../FW_Shared/lib/libjansson -L../FW_Shared/lib/libwebsockets -L/usr/lib/arm-linux-gnueabihf/ -L../HW_Reader/bin/NordicID/ -L../HW_Reader/lib/NordicID/ -L../FW_TestCtrl/bin/ -L$(LIB_DIR) -lmtTestCtrl -lmtTools -lNurApiRasPi -lrt -lm -lpthread -ljansson -llog4c -lwebsockets -lcrypto -lssl -lz 
INCLUDES = -I./include -I/usr/include/ -I../FW_Shared/log4c-1.2.4/src -I../FW_TestCtrl/include -I../HW_Reader/include/$(READER) -I../FW_Shared/jansson/include -I../FW_Shared/websockets/include -I../FW_Shared/tools/inc

TARGET = 0.0.0.0
TARGET_PATH = test/

all: $(NAME)

$(NAME): $(OBJ)
    $(CC) -o $(OUT_DIR)/$(NAME) $(INCLUDES) $(CFLAGS) $(OBJ) $(LIBS)

clean:
    rm -rf $(OBJ) *~ \#*\# src/*~ src/\#*\# include/*~ include/\#*\#

fclean: clean
    rm -rf $(OUT_DIR)/$(NAME)

re : fclean all

%.o:%.c
    $(CC) -c $< -o $@ $(CFLAGS) $(INCLUDES) $(LIBS)

.PHONY: clean fclean push

我找到了一些要添加的链接(如 -lz -lssl),以减少未定义的引用,但我找不到最后一个错误行缺少的链接。 也许这是纠正这个问题的另一种方法?

谢谢

【问题讨论】:

  • 能否请您添加gcc 命令以显示您如何链接和编译代码?或者,如果您使用的是 makefile,请添加一个 makefile。
  • 确实SSLv23_server_methodSSLv23_client_methodSSL_load_error_stringsOPENSSL_add_all_algorithms_noconfSSL_library_initSSL_library_initCRYPTO_cleanup_all_ex_dataERR_free_strings都表示链接器错误会消失如果你链接到 openssl.
  • 按照这个answer尝试这样的东西来编译和链接openssl -> gcc -Wall -Wextra -Werror -static -o myApp source1.o source2.o common.o -Lopenssl/openssl-0.9.8k/ -lssl -lcrypto -Iopenssl/openssl-0.9.8k/include
  • 感谢您的帮助 通常 -lssl 必须删除所有错误,但我想一次做太多事情。

标签: c gcc raspberry-pi arm libwebsockets


【解决方案1】:

通常 -lssl 必须删除所有错误,但是我使用的库版本存在问题。 (我尝试为 RaspBian Jessie 和 Raspbian Stretch 编译我的程序,并且某些库的版本已更改且不兼容)。 谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多