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