Я пытаюсь создать исполняемый файл, который использует мою ранее созданную общую библиотеку, которая, кстати, теперь является статической , которая включает статическую библиотеку openSSL. Поэтому я использовал тот же Makefile, который использовал для создания этой библиотеки, и взломал ее, чтобы она работала здесь. Вот как это выглядит
LIBBASE=/home/AB/Documents/APP/APP_2.17.0
OPENSSL1.0.2p_INSTALL_LOC=/home/AB/Documents/APP/OpenSSL-1.0.2p-installation
CC=gcc
CXX=g++
CFLAGS= -Wall -g -pedantic
CPPFLAGS= -Wall -g -pedantic
RM= rm -f
.PHONY: all clean
c_src=$(shell find . -iname "*.c")
$(info source=$(c_src))
cpp_src=$(shell find . -iname "*.cpp")
$(info cppsource=$(cpp_src))
INC=-I$(LIBBASE)/include
$(info includes=$(INC))
# need to link pthread library here as well
LIB = -pthread
# aforementioned library
LIB+=-L$(LIBBASE)/lib
LIB+= -l:libSCA.a
#need to add SSL related libraries
LIB+= -L$(OPENSSL1.0.2p_INSTALL_LOC)/lib
LIB+= -l:libssl.a -l:libcrypto.a -static-libgcc
# As mentioned, we need to link dl and libz libraries as well
LIB+= -ldl -lz
$(info links=$(LIB))
obj=$(c_src:.c=.o) $(cpp_src:.cpp=.o)
all: APP
clean:
$(RM) *.o APP
$(shell find $(APPBASE) -type f -iname "*.o" -exec rm -rf {} \;)
.c.o:
${CXX} -static ${CPPFLAGS} $(INC) -c $< -o $@
#${CC} -static ${CFLAGS} $(INC) -c $< -o $@
.cpp.o:
${CXX} -static ${CPPFLAGS} $(INC) -c $< -o $@
APP: $(obj)
$(LINK.cxx) $^ -o $@ $(LIB)
Я, однако, не могу заставить это работать. Я получаю множество неопределенных ссылок на символы, которые определяет моя библиотека. Я позаботился об использовании extern C вокруг этих символов в файлах cpp, но, похоже, это не помогает.
Кстати, есть ли более простой или простой способ, чем этот?
Кроме того, просматривая различные ответы здесь, я натолкнулся на утверждение, что цели типа .c.o
довольно устарели и больше не должны использоваться. Есть ли окончательное руководство по Makefiles, которое является недавним, исчерпывающим и практическим ( слишком много, чтобы спрашивать ) ??
ОБНОВЛЕНИЕ 1: Итак, вот что у меня естьдоступ к журналам, я заметил, что все неопределенные ошибки ссылок, которые я получаю, связаны с символами, определенными библиотекой SSL, которые я статически связывал с моей общей библиотекой. Пример моего журнала ошибок:
/home/AB/Documents/APP/APP_2.17.0_Linux/libAPP.so: undefined reference to `SSL_CTX_free'
/home/AB/Documents/APP/APP_2.17.0_Linux/libAPP.so: undefined reference to `X509_set_issuer_name'
Поэтому я подумал о создании статической библиотеки, которая будет внутренне связываться (или, скорее, включать) libssl.a
. Модифицировал мой вышеупомянутый make-файл и создал статический libAPP.a
. Но я все еще продолжал получать эти ошибки.
Я наконец добавил libssl.a
и libcrypto.a
в этот make-файл и вуаля, многие из этих ошибок были исправлены. У меня все еще были некоторые ошибки, связанные с dlopen
и pthreads, поэтому я также добавил их. Я также компилирую все с помощью компилятора CXX, чтобы устранить проблемы из-за искажения имени.
Теперь меня беспокоит то, что символы, связанные с SSL, уже должны присутствовать в libAPP.a
(хотя nm
сообщает о них как undefined и может нуждаться в другом вопросе самостоятельно: D)Но мне все еще нужно указать libSSL.a
и libcrypto.a
здесь, чтобы компоновщик их нашел! Так что хорошего в создании архива (libAPP.a
) вместо общей библиотеки (libAPP.so
)?
Наконец, на этапе компоновки мой компоновщик не может найти lz
/usr/bin/ld: cannot find -lz
Просточерт возьми, я попытался добавить тот же флаг в make-файл, который создает этот архив, и у него нет проблем с его поиском. Есть предложения ??