Comments (20)
修改的文件如下:
srpc下面的gnumakefile:
elseif(ANDROID)
ANDROID_NDK_HOME :=ndk的绝对路径
ANDROID_ABI_ARCH :=arm64
ANDROID_ABI :=arm64-v8a
ANDROID_API_LEVEL :=29
OPEN_SSL_DIR :=编译的openssl绝对路径
cd $(BUILD_DIR) && $(CMAKE3) -DANDROID_ABI=${ANDROID_ABI} -DANDROID_PLATFORM=android-${ANDROID_API_LEVEL} -DANDROID_NDK=${ANDROID_NDK_HOME} -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake -DOPENSSL_INCLUDE_DIR=${OPEN_SSL_DIR}/include -DOPENSSL_LINK_DIR=${OPEN_SSL_DIR} $(ROOT_DIR)
workflow也是上面类似修改
2.srpc里面的cmakelist修改如下
#set(CMAKE_CROSSCOMPILING TRUE)
if(ANDROID)
include_directories(${OPENSSL_INCLUDE_DIR})
link_directories(${OPENSSL_LINK_DIR})
else()
find_package(OpenSSL REQUIRED)
endif ()
set(protobuf_MODULE_COMPATIBLE ON CACHE BOOL "")
if (WIN32)
find_package(Protobuf REQUIRED CONFIG)
else ()
if(ANDROID)
SET(Protobuf_INCLUDE_DIR /home/XX/Android/protobuf-3.14.0/src)
SET(Protobuf_LIBRARY /home/XX/Android/protobuf-3.14.0/cmake)
SET(Protobuf_LIB_DIR /home/XX/Android/protobuf-3.14.0/cmake)
else()
find_package(Protobuf 3.5.0 REQUIRED)
endif()
endif ()
elseif(ANDROID)
target_link_libraries(${SHARED_LIB_NAME} ssl crypto protobuf workflow z)
另外srpc里面的message和module模块也需要修改
if(ANDROID)
SET(Protobuf_INCLUDE_DIR /home/XX/Android/protobuf-3.14.0/src)
SET(Protobuf_LIBRARY /home/XX/Android/protobuf-3.14.0/cmake)
find_package(Protobuf REQUIRED)
endif()
from srpc.
指定openssl include和so路径后,报错如下:
/home/Android/srpc/workflow/src/manager/WFGlobal.cc:566:16: error: use of undeclared identifier 'getline'; did you mean 'std::getline'?
while ((ret = getline(&line, &bufsize, fp)) > 0)
^~~~~~~
std::getline
/home/Android/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/string:4244:1: note: 'std::getline' declared here
getline(basic_istream<_CharT, _Traits>& __is,
^
/home/Android/srpc/workflow/src/manager/WFGlobal.cc:566:16: error: no matching function for call to 'getline'
while ((ret = getline(&line, &bufsize, fp)) > 0)
^~~~~~~
/home/barton/Android/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/string:4244:1: note: candidate template ignored: could not match 'basic_istream<type-parameter-0-0, type-parameter-0-1>' against 'char **'
getline(basic_istream<_CharT, _Traits>& __is,
^
2 errors generated.
from srpc.
改成std::getline提示参数不匹配。只有2个参数,实际传了三个。
from srpc.
我们看看先前能在Android上编译过的版本对比一下,看看是不是后来加的、是否需要替换掉这个函数。
from srpc.
thank you very much,想问一下你们之前在Android上面编译有文档么?
from srpc.
sogou/workflow#773
原先有一个人在Android上编译过Workflow,写了个很详细的总结,可以看看这个~
另外确认了下commit log,当时已经是这样使用的getline
了,但是他没有遇到这样的问题。你如果还没有解决,可以到这个issue下圈他问问。
from srpc.
目前workflow android可以编译通过,srpc还不行。
参考workflow的cmakelist修改了一下srpc/src/目录下的cmakelist。
if(ANDROID)
include_directories(${OPENSSL_INCLUDE_DIR})
link_directories(${OPENSSL_LINK_DIR})
else()
find_package(OpenSSL REQUIRED)
endif ()
set(protobuf_MODULE_COMPATIBLE ON CACHE BOOL "")
if (WIN32)
find_package(Protobuf REQUIRED CONFIG)
else ()
if(ANDROID)
set(PROTOBUF_DIR /home/barton/Android/protobuf-3.14.0/cmake)
include_directories(${PROTOBUF_DIR})
link_directories(${PROTOBUF_DIR})
else()
find_package(Protobuf 3.5.0 REQUIRED)
endif()
endif ()
但是还是有报错,应该是系统本身的protoc没有加入环境变量:
CMake Error at src/module/CMakeLists.txt:13 (protobuf_generate_cpp):
Unknown CMake command "protobuf_generate_cpp".
from srpc.
感觉这个是OPENSSL_CRYPTO_LIBRARY缺少了,你尝试一下手动指定一下?比如
set(OPENSSL_CRYPTO_LIBRARY /path/to/openssl/lib/libcrypto.a)
一般来说通过OPENSSL_ROOT_DIR
的路径应该就可以找到crypto了,所以在一般环境下,这个在CMakeCache.txt里可以找到这个变量。
不过这个crypto包workflow也需要,感觉crypto本身不应该有区别才是~
from srpc.
再请教一下protobuf_generate_cpp这个是调用本机的protoc的么,而非host的,目前我指定的protobuf dir是host主机的,不知道这块怎么设置
from srpc.
protobuf_generate_cpp会由CMake 自动查找 protoc 工具的路径。CMake 会首先查找系统路径,如果找不到,则会查找 PROTOBUF_PROTOC_EXECUTABLE 变量指定的路径。如果 PROTOBUF_PROTOC_EXECUTABLE 变量未设置,则会使用默认路径 /usr/bin/protoc。
这个得看你find_package(protobuf)用的是哪个路径,需要libprotobuf.so和protoc版本对应。如果这里不确定,要不你手动指定一下set (PROTOBUF_PROTOC_EXECUTABLE /xxx/xxx/protoc)
让它们对应起来试试看?
from srpc.
https://blog.csdn.net/gcs_20210916/article/details/123919119这个链接有说明,不过目前试了效果还是提示package找不到,我再看看
from srpc.
手动指定,如下方式,还是提示unknown command protobuf_generate_cpp
set (PROTOBUF_PROTOC_EXECUTABLE /home/barton/work/protobuf-3.14.0/src)
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROTO_LIST})
参考这个文章,https://blog.csdn.net/gcs_20210916/article/details/123919119 也不太行。
目前看就是找不到protoc的路径。
from srpc.
试试set (PROTOBUF_PROTOC_EXECUTABLE /home/barton/work/protobuf-3.14.0/src/protoc) ?
from srpc.
set (PROTOBUF_PROTOC_EXECUTABLE /home/barton/work/protobuf-3.14.0/src/protoc)这个设置之后还是会提示unknown command protobuf_generate_cpp
参考这个https://blog.csdn.net/lnwaycool/article/details/102685354 可以编译过去一部分
SET(Protobuf_INCLUDE_DIR /home/barton/Android/protobuf-3.14.0/src)
SET(Protobuf_LIBRARY /home/barton/Android/protobuf-3.14.0/cmake)
include_directories(${Protobuf_INCLUDE_DIR})
link_directories(${Protobuf_LIBRARY})
在module的cmakelists.txt里面添加
if(ANDROID)
find_package(Protobuf REQUIRED)
else()
find_package(Protobuf 3.5.0 REQUIRED)
endif()
module编译正常,但是在message里面添加还是提示找不到protobuf
/home/barton/Android/protobuf-3.14.0/src/google/protobuf/arena.h:658: error: undefined reference to 'google::protobuf::Arena
我android编译的proto在Android/protobuf-3.14.0/,本地编译的在work/protobuf-3.14.0/,感觉还是proto的配置有问题
from srpc.
虽然不太了解Android下的依赖应该怎么写,但是看了下当时workflow支持Android的时候,cmake文件里都进行了如下改动:
参考文件:https://github.com/sogou/workflow/blob/master/src/CMakeLists.txt
1、编译时,依赖库通过交叉编译指定的路径:
if(ANDROID)
include_directories(${OPENSSL_INCLUDE_DIR})
link_directories(${OPENSSL_LINK_DIR})
else()
find_package(OpenSSL REQUIRED)
endif ()
2、链接时,依赖库需要明确指定一下:
if(ANDROID)
target_link_libraries(${SHARED_LIB_NAME} ssl crypto c)
else()
target_link_libraries(${SHARED_LIB_NAME} OpenSSL::SSL OpenSSL::Crypto pthread)
endif ()
要不你试试把这里:https://github.com/sogou/srpc/blob/master/src/CMakeLists.txt#L154 模仿Workflow里的写法?比如(但不一定正确,需要你在环境里调一下)
if (APPLE)
target_link_libraries(${SHARED_LIB_NAME} OpenSSL::SSL OpenSSL::Crypto pthread protobuf workflow z ${SNAPPY_LIB} ${LZ4_LIB})
if (ANDROID) # 写法不一定正确,大概这么个想法?
target_link_libraries(${SHARED_LIB_NAME} ssl crypto c protobuf workflow z snappy)
else ()
target_link_libraries(${SHARED_LIB_NAME})
endif ()
如果确认了src/CMakeLists.txt和tutorial/CMakeLists.txt的正确改法,可以给srpc提一个PR,感谢~
from srpc.
另外请教一下,编译出so后,在编译sample的时候出现如下错误:
vendor/androidsrpcsample/include/srpc/rpc_message.h:30:7: error: 'srpc::RPCRequest' has virtual functions but non-virtual destructor [-Werror,-Wnon-virtual-dtor]
class RPCRequest
^
vendor/androidsrpcsample/include/srpc/rpc_message.h:45:35: warning: unused parameter 'seqid' [-Wunused-parameter]
virtual void set_seqid(long long seqid) {}
^
vendor/androidsrpcsample/include/srpc/rpc_message.h:48:7: error: 'srpc::RPCResponse' has virtual functions but non-virtual destructor [-Werror,-Wnon-virtual-dtor]
class RPCResponse
^
vendor/androidsrpcsample/include/srpc/rpc_message.h:61:33: warning: unused parameter 'code' [-Wunused-parameter]
virtual bool set_http_code(int code) { return false; }
^
vendor/androidsrpcsample/include/srpc/rpc_message.h:64:7: error: 'srpc::RPCMessage' has virtual functions but non-virtual destructor [-Werror,-Wnon-virtual-dtor]
class RPCMessage
这个虚函数应该是在其他模块里面实现的。
from srpc.
-
感谢你的建议!方便的话可以把你的修改提一个PR给我们,这样在你的环境上 run过的比较能保证正确性。
不过像ANDROID_XXX这种设置是否可以跟workflow那边的小伙伴那样单独放到一个脚本里呢?就是只对CMakeList做每个环境必要的、通用的修改,把其他系统的package信息提出到各个具体环境下独立使用。 -
这个确实应该把基类的虚析构加上的(其他环境下竟然没有报这个错误,可能和默认flag有关Q_Q)。我提个PR,review并merge了之后给你说,谢谢~
from srpc.
改动的东西比较零散,等我有空看看能不能整合成一个脚本
from srpc.
好的,感谢,不急。
上面的编译错误已经改好merge了,麻烦拉一下代码再试试~
from srpc.
目前看srpc依赖的libcrypto和libssl以及libprotobuf和Android系统的有冲突,目前只能应用到apk里面。服务里面不可以。
from srpc.
Related Issues (20)
- 在SRPCHttpServer上启用trace上报opentelemtry功能异常 HOT 6
- 关于 RPCBuffer 中 read_back 问题 HOT 3
- 关于 RPCBuffer::cut 和 BRPC 中的 attachment 使用的问题 HOT 2
- 是否计划支持linux io_uring? HOT 3
- SRPC性能测试问题 HOT 25
- client.Echo start multi thread,how can I start only one thread? HOT 6
- thrift oneway 无法正确解析 HOT 2
- list<bool>和map返回值不能正确处理 HOT 16
- 想问一下srpc会存在粘包问题么? HOT 1
- in sync mode,It took a long time to get data from server,how can I debug? HOT 18
- srpc::ThriftClient 是否可以访问原生thrift的TMultiplexedProcessor HOT 1
- 有2层namespace时,生成代码出错 HOT 3
- 关于一个server有多个service,不能正常访问 HOT 9
- SRPC支持自定义拦截器吗 HOT 11
- SRPC Http客户端与服务端参数不一致问题 HOT 2
- openeuler下编译时会报错C++标准,建议更新C++标准从11到14 HOT 3
- 应该如何正确的报错呢? HOT 1
- SRPCHttpServer中不支持自定url映射方法 HOT 3
- Protobuf v5 support HOT 4
- 在arm上的编译问题 HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from srpc.