Проблема при связывании с POCO :: Net :: SocketAddress

Я работаю на Android родной проект, в котором я использую NDK + CMake для создания собственного решения, основанного на POCO C ++. Я получаю очень странные ошибки ссылки, когда я закомментировать эту строку в моем файле CPP:

//std::ostream& o = session.sendRequest(request);

это ошибка ссылки:

../NetSSL_OpenSSL/src/SecureSocketImpl.cpp:381: Ошибка: неопределенная ссылка на 'Poco :: Net :: SocketAddress :: ~ SocketAddress ()'

Но еще более странно, что файл с объектом, где sendRequest помещают его не включаются в любом другом файле. Итак, у меня есть один выделенный файл (заголовок и реализация), который не включен в любой другой файл (но это сборка с CMake, я не могу удалить его из-за вопроса), и если я комментарий <сильный> одна строка реализации, она порождает проблему связи.

Вот как я связываю Poco:

cmake_minimum_required(VERSION 3.10)

set(CMAKE_CXX_COMPILER_VERSION "5.0") # Unknown miss-detection of the compiler by CMake

find_library( # Defines the name of the path variable that stores the
        # location of the NDK library.
        log-lib
        # Specifies the name of the NDK library that
        # CMake needs to locate.
        log )

add_library(PocoFoundation STATIC IMPORTED)
set_target_properties(PocoFoundation PROPERTIES IMPORTED_LOCATION
        /Users/user/dev/poco-2/install/lib/libPocoFoundation.a)

add_library(PocoNet STATIC IMPORTED)
set_target_properties(PocoNet PROPERTIES IMPORTED_LOCATION
        /Users/user/dev/poco-2/install/lib/libPocoNet.a)

add_library(PocoJSON STATIC IMPORTED)
set_target_properties(PocoJSON PROPERTIES IMPORTED_LOCATION
        /Users/user/dev/poco-2/install/lib/libPocoJSON.a)

add_library(PocoNetSSL STATIC IMPORTED)
set_target_properties(PocoNetSSL PROPERTIES IMPORTED_LOCATION
        /Users/user/dev/poco-2/install/lib/libPocoNetSSL.a)

add_library(PocoCrypto STATIC IMPORTED)
set_target_properties(PocoCrypto PROPERTIES IMPORTED_LOCATION
        /Users/user/dev/poco-2/install/lib/libPocoCrypto.a)

add_library(PocoUtil STATIC IMPORTED)
set_target_properties(PocoUtil PROPERTIES IMPORTED_LOCATION
        /Users/user/dev/poco-2/install/lib/libPocoUtil.a)

add_library(PocoXML STATIC IMPORTED)
set_target_properties(PocoXML PROPERTIES IMPORTED_LOCATION
        /Users/user/dev/poco-2/install/lib/libPocoXML.a)


// ... SOURCES ...

target_include_directories(mylib PRIVATE /Users/user/dev/poco-2/install/include)


target_link_libraries(mylib
        PocoNet
        PocoNetSSL
        PocoUtil
        PocoJSON
        PocoCrypto
        PocoXML
        PocoFoundation
        Ssl
        Crypto
        ${log-lib})

Кроме того, я использую Android Studio 3.6.2 с NDK версии r19c. Я пробовал очистить сборку, перестроить и очистить .cxx, .gradle и папку сборки.

Любая идея?


person Juan Garcia    schedule 20.11.2020    source источник
comment
Я не думаю, что проблема с вашим кодом, это выглядит как цель PocoNetSSL не зависит от (я думаю) PocoNet? Вам нужно будет поделиться своей полной настройкой CMake.   -  person Botje    schedule 20.11.2020
comment
Я только что проверил: официальная цель Poco :: NetSSL ссылается на Poco :: Net. Откуда вы взяли настройку CMake?   -  person Botje    schedule 20.11.2020
comment
@Botje, спасибо за ответ. Обновленный вопрос с настройкой CMake.   -  person Juan Garcia    schedule 20.11.2020
comment
Вам также необходимо восстановить зависимости между статическими библиотеками, чтобы cmake мог связывать их в правильном порядке (зависимости после библиотеки, которая в них нуждается)   -  person Botje    schedule 20.11.2020


Ответы (1)


Вам необходимо воссоздать межбиблиотечные зависимости, чтобы CMake мог построить правильную командную строку компоновщика с зависимостями после зависимых от них библиотек.

Запуск через библиотеки, которые вы перечислили, которые должны быть по крайней мере следующее (реконструируемого из Poco CMakeLists.txt).

target_link_libraries(PocoNet PocoFoundation)
target_link_libraries(PocoNetSSL PocoCrypto PocoUtil PocoNet)
target_link_libraries(PocoCrypto PocoFoundation Ssl Crypto)
target_link_libraries(PocoUtil PocoFoundation)
target_link_libraries(PocoJSON PocoFoundation)
target_link_libraries(PocoXML PocoFoundation)
person Botje    schedule 20.11.2020
comment
Благодарность! вот и дело. Только примечание для читателей в будущем, вы должны сделать target_link_libraries с вашей библиотекой, в качестве первого аргумента в каждой инструкции: target_link_libraries (mylilb PocoNet PocoFoundation) ... - person Juan Garcia; 23.11.2020
comment
В CMakeLists в вашем вопросе уже, что так я не упоминал об этом снова. - person Botje; 23.11.2020