Компиляция C и C ++ с одним make-файлом - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь создать исполняемый файл, который использует мою ранее созданную общую библиотеку, которая, кстати, теперь является статической , которая включает статическую библиотеку 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-файл, который создает этот архив, и у него нет проблем с его поиском. Есть предложения ??

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Наиболее очевидная проблема заключается в том, что вы используете $(LINK.c) для связи, когда ваша программа содержит компоненты C ++, поэтому вы не получаете никаких библиотек C ++ или чего-либо подобного. Попробуйте использовать $(LINK.C) или $(LINK.cc) или $(LINK.cpp) или $(LINK.cxx) (что для C ++ зависит от версии make, но по крайней мере один из них должен быть предопределен).

0 голосов
/ 08 ноября 2019

Я бы сделал это в следующих шагах:

  1. Соберите все команды, чтобы собрать все "вручную". Только если это работает, имеет смысл двигаться дальше, если вы новичок. Эти команды могут быть помещены в командный файл.
  2. Извлечь зависимости и правила.
  3. Запишите это в Makefile;в конце дня Makefile - это просто сжатое знание как построить.
  4. Попробуйте Makefile.
  5. Если у меня возникнут ошибки, я воспользуюсь makeварианты -d, -p и -n, чтобы увидеть, что он думает. Там могут быть более полезные опции.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...