【问题标题】:Issue linking against POCO::Net::SocketAddress针对 POCO::Net::SocketAddress 的问题链接
【发布时间】:2021-03-03 18:20:06
【问题描述】:

我正在开发一个 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})

另外,我正在使用带有 NDK 版本 r19c 的 Android Studio 3.6.2。我已经尝试清理构建、重建和清理 .cxx、.gradle 和构建文件夹。

有什么想法吗?

【问题讨论】:

  • 我不认为你的代码有这个问题,看起来 PocoNetSSL 目标不取决于(我猜)PocoNet?您必须分享您的完整 CMake 设置。
  • 我刚刚检查了:官方 Poco::NetSSL 目标 links to Poco::Net。您从哪里获得 CMake 设置?
  • @Botje 感谢您的回复。使用 CMake 设置更新问题。
  • 您还需要重构静态库​​之间的依赖关系,以便 cmake 可以以正确的顺序链接它们(依赖关系在需要它们的库之后)

标签: android c++ cmake android-ndk poco-libraries


【解决方案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)

【讨论】:

  • 谢谢!这就是诀窍。只是给未来读者的注意事项,您需要使用您的 lib 作为每个语句中的第一个参数来执行 target_link_libraries:target_link_libraries(mylilb PocoNet PocoFoundation) ...
  • 你问题中的 CMakeLists 已经有了,所以我没有再提到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多