Каков правильный способ создания статического двоичного файла с помощью openssl?

У меня есть следующий make-файл:

CC=g++
CFLAGS=-c -Wall
REST_LIBS = -lssl -lcrypto -lboost_system -lcpprest

all: main

main: static_pack
    g++ -std=c++14 -D DEBUG -Wfatal-errors -static -pthread -I$(basepath)/vendors/cpp-jwt/include -I$(basepath)/vendors/json/include \
    -DTS=\"/ctts.json\" \
    -DCS_PATH=\"/bin\" \
    -DCTFS_ENC=\"/ctfs.enc\" \
    -DUNTAR_PATH=\"/\" \
    -DCLUSTER_PATH=\"/.clusters\" \
     -o run main.cpp \
    libmain.a && \
    rm -rf debpkg/cs/usr/bin/cs debpkg/cs.deb && \
    cp run debpkg/cs/usr/bin/cs && \
    dpkg-deb -b debpkg/cs && \
    mv debpkg/cs.deb .

static_pack: rest.o aes.o random.o
    ar rcs libmain.a random.o aes/aes.o rest/rest.o

rest.o:
    g++ -std=c++14 -Wfatal-errors -c $(REST_LIBS) -o rest/rest.o rest/rest.cpp 


aes.o: random.o
    g++ -std=c++14 -D DEBUG -Wfatal-errors -c -lcrypto -o aes/aes.o random.o aes/aes.cpp

random.o:
    g++ -std=c++14 -Wfatal-errors -c -o random.o random.cpp

Если я скомпилирую это для динамической компоновки, у меня не будет проблем. Однако, когда я пытаюсь статическую компиляцию, я получаю массу ошибок, таких как:

aes.cpp:(.text+0x706): undefined reference to `EVP_DecryptInit_ex'
aes.cpp:(.text+0x732): undefined reference to `EVP_DecryptUpdate'
aes.cpp:(.text+0x763): undefined reference to `EVP_CIPHER_CTX_ctrl'
aes.cpp:(.text+0x792): undefined reference to `EVP_DecryptFinal_ex'
aes.cpp:(.text+0x7a1): undefined reference to `EVP_CIPHER_CTX_free'

По сути, ни один из символов не найден. Я не уверен, что мне нужно делать сейчас. Я пытался создать свои объектные файлы как статические, но это не помогло. Я изучил порядок связывания, но это кажется правильным.

Мой вопрос сводится к двум вещам:

  1. При статической компоновке других объектов нужно ли статически компилировать и архивировать эти объекты?

  2. Что не так с моей настройкой?


person Dr.Knowitall    schedule 02.06.2018    source источник
comment
Какова цель передачи двух входных файлов при создании объектного файла (как вы делаете для aes.o)?   -  person Some programmer dude    schedule 03.06.2018
comment
Что касается вашей проблемы, где должны быть недостающие функции? Вам не хватает объекта или исходного файла? Возможно, вам не хватает связи с библиотекой?   -  person Some programmer dude    schedule 03.06.2018
comment
Я создаю свои приложения по модульному принципу. Я могу выполнить модульное тестирование отдельных модулей, таких как random.o, которые я исключил из вопроса SO. Постройте все свои модульные тесты вокруг файлов .o. Позже я свяжу эти файлы вместе, чтобы создать приложение. Если бы я хотел превратить эти файлы в отдельные файлы lib, это было бы легко.   -  person Dr.Knowitall    schedule 03.06.2018
comment
Все недостающие функции уже есть в библиотеках .so, установленных в системе. Я дважды проверил, и в моих библиотеках также есть компоненты .a, поэтому он должен иметь возможность извлекать мои символы... libssl.a и libcrypto.a находятся в системе в пути к lib.   -  person Dr.Knowitall    schedule 03.06.2018
comment
Почему голосование против. Если вы не предлагаете очевидный ответ на вопрос или критику того, как улучшить, вам не должно быть позволено проголосовать против.   -  person Dr.Knowitall    schedule 03.06.2018


Ответы (2)


Вам не нужно REST_LIBS для правила rest.o, так как оно компилирует только исходный файл. Вам нужно передать эти библиотеки g++ в правиле main - как часть этого, g++ вызовет компоновщик.

person joe_chip    schedule 02.06.2018
comment
Спасибо, я всегда не был уверен в этом фрагменте в моем make-файле. - person Dr.Knowitall; 03.06.2018

Итак, по-видимому, связывание происходит в порядке, противоположном тому, который я думал... и я думаю, что возможно, что я изначально не связывался из-за ошибки фуфу.

REST_LIBS = -lboost_filesystem -lboost_system -lcpprest -lssl -lcrypto -ldl
# /usr/local/lib/libyaml-cpp.a

all: main

main: static_pack
    g++ -std=c++14 -D DEBUG -Wfatal-errors -I$(basepath)/vendors/cpp-jwt/include -I$(basepath)/vendors/json/include \
    -DTS=\"/ctts.json\" \
    -DCS_PATH=\"/bin\" \
    -DCTFS_ENC=\"/ctfs.enc\" \
    -DUNTAR_PATH=\"/\" \
    -DCLUSTER_PATH=\"/.clusters\" \
     -o run main.cpp \
    libmain.a $(REST_LIBS) -pthread  && \
    rm -rf debpkg/cs/usr/bin/cs debpkg/cs.deb && \
    cp run debpkg/cs/usr/bin/cs && \
    dpkg-deb -b debpkg/cs && \
    mv debpkg/cs.deb .
person Dr.Knowitall    schedule 03.06.2018