针对 POCO::Net::SocketAddress 的问题链接

Issue linking against POCO::Net::SocketAddress

我正在开发一个 Android 本机项目,我在其中使用 NDK + CMake 构建基于 POCO C++ 的本机解决方案。当我在我的 cpp 文件中评论这一行时,我遇到了一个超级奇怪的 link 错误:

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

这是 link 错误:

../NetSSL_OpenSSL/src/SecureSocketImpl.cpp:381:错误:未定义对 'Poco::Net::SocketAddress::~SocketAddress()'

的引用

但更奇怪的是,带有 object 的文件位于 sendRequest 的位置,但它没有包含在任何其他文件中。所以,我有一个独立的文件(header 和实现)没有被包含在任何其他文件中(但它是用 CMake 构建的,由于这个问题我无法删除它)并且如果我评论 一行 的实施,它会产生一个 link 问题。

这就是我 link使用 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 和构建文件夹。

有什么想法吗?

您需要重新创建库间依赖关系,以便 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)