【发布时间】: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