Скомпилируйте проект, используя Poco (с включенным Crypto / NetSSL) в Windows, и сделайте кросс-компиляцию в Linux ARM - PullRequest
0 голосов
/ 22 мая 2019

Обзор: Я работаю над приложением командной строки (C ++), которое использует библиотеки POCO. Мы работали с CI по gitlab, компилируя этот проект на Windows x64, Linux x64 & x86, Linux arm 32b. Раньше мы запускали клиент и сервер на одной машине, но они хотят, чтобы мы запускали его через Интернет. Из-за использования сервера Poco TCP это уже возможно, но мне нужно интегрировать шифрование (SSL).

После того, как я включил части шифрования в проекте библиотеки POCO, он стал не компилируемым в Windows и ARM из-за зависимости OpenSSL. На Linux TCP Server с шифрованием работает нормально.

Проблемы с Windows: Я пытался установить openSSL по-разному и в разные папки, cmake находит его, но в конце компиляции некоторые файлы отсутствуют. На форумах я обнаружил, что необходимо внести изменения, чтобы запустить POCO со стандартным OpenSSL, я не знаю, какие изменения (если бы я знал, я бы попытался это сделать). Я пытался использовать предварительно скомпилированный OpenSSL из библиотеки poco, но он выдает много ошибок (отсутствующих файлов) во время isntallation. Вот ссылка на стандартный OpenSSL, который я использовал (не облегченная версия, установленная как 32 a 64b): https://slproweb.com/products/Win32OpenSSL.html

Проблемы кросс-компиляции Linux ARM: Это также заканчивается OpenSSL (поэтому я решил написать все это в одном посте, несмотря на различия в платформах). Я успешно скомпилировал OpenSSL на платформе ARM от репозитория gitlab авторов, но cmake не может его найти, даже когда я устанавливаю системную переменную cmake на правильный путь. OpenSSL также установлен на машине (но это вряд ли помогает, потому что это не ручная машина).

РЕДАКТИРОВАТЬ: Проблема возможна из-за включений У меня есть все, что связано с шифрованием в одном классе, включая из .h файла:

#include "Poco/Net/SocketReactor.h"
#include "Poco/Net/SocketAcceptor.h"
#include "Poco/Net/SocketNotification.h"
#include "Poco/Net/SecureServerSocket.h"
#include "Poco/NObserver.h"
#include "Poco/Exception.h"
#include "Poco/Thread.h"
#include "Poco/FIFOBuffer.h"
#include "Poco/Delegate.h"
#include "Poco/Util/ServerApplication.h"
#include "Poco/Util/Option.h"
#include "Poco/Util/OptionSet.h"
#include "Poco/Util/HelpFormatter.h"
#include <iostream>
#include "ProcessUtils.h"
#include "ServiceHandler.h"

.cpp:

#include "Poco/Net/Context.h"
#include <iostream>
#include <signal.h>
#include <thread>
#include <Sleep.h>
#include <common/Version.h>
#include <AppConfig.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <SecuredServerRuntime.h>

Как я его использую:

Poco::Net::Context secureContext(Poco::Net::Context::SERVER_USE, key, certificate, "", Poco::Net::Context::VERIFY_RELAXED, 9, false);
            Poco::Util::Application::instance().logger().information("Listening on IP address %s:%d", this->address, (int)port);
            SecureServerSocket svs(sa, 64, &secureContext);
            SocketReactor reactor;
            SocketAcceptor<ServiceHandler> acceptor(svs, reactor);

РЕДАКТИРОВАТЬ 2:

Cmake:

list(APPEND LIBRARIES )

#region POCO setup
# list all enabled libraries and set include paths
foreach (POCOLIB Foundation XML Util Net NetSSL Crypto JSON)
        list(APPEND LIBRARIES Poco${POCOLIB})
        target_include_directories(${PROJECT_NAME} PRIVATE lib/Poco/${POCOLIB}/include)
endforeach ()
target_link_libraries(${PROJECT_NAME} ${LIBRARIES})

в списке cmake в папке зависимостей есть строка "include (Poco.cmake)"

Poco.cmake:

get_filename_component(THIS_FILE ${CMAKE_CURRENT_LIST_FILE} NAME_WE)
message(STATUS "Configuring ${THIS_FILE}")

# and set the options for POCO
set(ENABLE_CPPUNIT OFF CACHE BOOL "Enable the CppUnit" FORCE)
set(ENABLE_XML ON CACHE BOOL "Enable the XML" FORCE)
set(ENABLE_JSON ON CACHE BOOL "Enable the JSON" FORCE)
set(ENABLE_MONGODB OFF CACHE BOOL "Enable MongoDB" FORCE)
set(ENABLE_PDF OFF CACHE BOOL "Enable PDF" FORCE)
set(ENABLE_UTIL ON CACHE BOOL "Enable Util" FORCE)
set(ENABLE_NET ON CACHE BOOL "Enable Net" FORCE)
set(ENABLE_NETSSL ON CACHE BOOL "Enable NetSSL" FORCE)
set(ENABLE_NETSSL_WIN ON CACHE BOOL "Enable NetSSL Windows" FORCE)
set(ENABLE_CRYPTO ON CACHE BOOL "Enable Crypto" FORCE)
set(ENABLE_DATA OFF CACHE BOOL "Enable Data" FORCE)
set(ENABLE_DATA_SQLITE OFF CACHE BOOL "Enable Data SQlite" FORCE)
set(ENABLE_DATA_MYSQL OFF CACHE BOOL "Enable Data MySQL" FORCE)
set(ENABLE_DATA_POSTGRESQL OFF CACHE BOOL "Enable Data PosgreSQL" FORCE)
set(ENABLE_DATA_ODBC OFF CACHE BOOL "Enable Data ODBC" FORCE)
set(ENABLE_SEVENZIP OFF CACHE BOOL "Enable SevenZip" FORCE)
set(ENABLE_ZIP OFF CACHE BOOL "Enable Zip" FORCE)
set(ENABLE_APACHECONNECTOR OFF CACHE BOOL "Enable ApacheConnector" FORCE)
set(ENABLE_CPPPARSER OFF CACHE BOOL "Enable C++ parser" FORCE)
set(ENABLE_POCODOC OFF CACHE BOOL "Enable Poco Documentation Generator" FORCE)
set(ENABLE_PAGECOMPILER OFF CACHE BOOL "Enable PageCompiler" FORCE)
set(ENABLE_PAGECOMPILER_FILE2PAGE OFF CACHE BOOL "Enable File2Page" FORCE)
set(ENABLE_REDIS OFF CACHE BOOL "Enable Redis" FORCE)

# build static
set(POCO_STATIC ${STATIC_LINKING} CACHE BOOL "Set to OFF|ON (default is OFF) to control build of POCO as STATIC library" FORCE)
set(POCO_MT OFF CACHE BOOL "Set to OFF|ON (default is OFF) to control build of POCO as /MT instead of /MD" FORCE)

message(STATUS "POCO static = ${POCO_STATIC}")

# parallel build
#set(ENABLE_MSVC_MP ${${PROJECT_NAME}_PARALLEL_BUILD} CACHE BOOL "Set to OFF|ON (default is OFF) to control parallel build with MSVC" FORCE)

if (NOT TARGET Foundation)
    add_subdirectory(Poco)
endif ()

1 Ответ

0 голосов
/ 24 мая 2019
find_package(OpenSSL REQUIRED)
target_link_libraries(${PROJECT_NAME} OpenSSL::SSL)

Благодаря @ Цывареву, это решило проблему в Windows (с предыдущими модификациями, которые я обсуждал с ним в комментариях).

В случае компиляции ARM (которая все еще не работает) это выдает ошибку, котораяон не может найти OpenSSL, несмотря на то, что я скомпилировал его раньше и установил переменную OpenSSL_ROOT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...