RCF是一个C++开发的RPC框架。下面把RCF的编译和简单使用过程做一个记录,使用的是RCF3.0,操作系统是Centos7.0(64位):
1、下载RCF源码
进入RCF官网,下载文件RCF-3.0.251.tar.gz
2、解压安装包
[root@localhost root]# tar -zvcf RCF-3.0.251.tar.gz
[root@localhost root]# cd RCF-3.0.251
[root@localhost RCF-3.0.251]# ls
demo doc include LICENSE.txt README.txt src
[root@localhost RCF-3.0.251]#
3、测试代码(RCF源码可以加入到程序中一起编译)
ex1_server.c
#include
#include
RCF_BEGIN(I_PrintService, "I_PrintService") //RCF接口定义
RCF_METHOD_V1(void, Print, const std::string &) //RCF_METHOD_通用前缀,V表示返回值void, //1表示一个参数
RCF_END(I_PrintService)
class PrintService
{
public:
void Print(const std::string & s)
{
std::cout << "I_PrintService service: " << s << std::endl;
}
};
int main(int argc, char **argv)
{
try
{
RCF::RcfInit rcfInit; //初始化RCF
RCF::RcfServer server(RCF::TcpEndpoint("192.168.241.129", 500001)); //建立RCF远程服务,设定IP和端口
PrintService printService;
server.bind(printService); //绑定接口函数
server.start(); //启动服务,不会阻塞当前线程
std::cout << "Press Enter to exit..." << std::endl;
std::cin.get();
}
catch(const RCF::Exception &e)
{
std::cout << "Error: " << e.getErrorMessage() << std::endl;
}
return 0;
}
ex1_client.c
#include
#include
RCF_BEGIN(I_PrintService, "I_PrintService") //RCF接口
RCF_METHOD_V1(void, Print, const std::string &)
RCF_END(I_PrintService)
int main(int argc, char **argv)
{
try
{
RCF::RcfInit rcfInit; //初始化RCF
std::cout << "Calling the I_PrintService Print() method. " << std::endl;
RcfClient client(RCF::TcpEndpoint("192.168.241.129", 500001)); //创建客户端并连接
for (int i = 0; i < 10000; i++) //循环调用远程函数
{
client.Print("Hello World");
std::cout << i << std::endl;
}
}
catch(const RCF::Exception & e)
{
std::cout << "Error: " << e.getErrorMessage() << std::endl;
}
return 0;
}
4、编译
[root@localhost RCF]# g++ ex1_server.c ./RCF-3.0.251/src/RCF/RCF.cpp -o ex1_server -I ./RCF-3.0.251/include/ -lpthread -ldl -luuid
In file included from /usr/include/c++/4.8.2/type_traits:35:0,
from ./RCF-3.0.251/include/RCF/Idl.hpp:23,
from ./RCF-3.0.251/include/RCF/RCF.hpp:23,
from ex1_server.c:2:
/usr/include/c++/4.8.2/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
#error This file requires compiler and library support for the \
^
In file included from ./RCF-3.0.251/include/SF/Registry.hpp:31:0,
from ./RCF-3.0.251/include/SF/Serializer.hpp:369,
from ./RCF-3.0.251/include/SF/Archive.hpp:88,
from ./RCF-3.0.251/include/SF/Stream.hpp:322,
from ./RCF-3.0.251/include/SF/IBinaryStream.hpp:22,
from ./RCF-3.0.251/include/RCF/SerializationProtocol_SF.hpp:24,
from ./RCF-3.0.251/include/RCF/SerializationProtocol.hpp:38,
from ./RCF-3.0.251/include/RCF/ClientStub.hpp:37,
from ./RCF-3.0.251/include/RCF/Future.hpp:22,
from ./RCF-3.0.251/include/RCF/Idl.hpp:27,
from ./RCF-3.0.251/include/RCF/RCF.hpp:23,
from ex1_server.c:2:
./RCF-3.0.251/include/RCF/ThreadLibrary.hpp:23:24: fatal error: shared_mutex: No such file or directory
#include
^
compilation terminated.
In file included from /usr/include/c++/4.8.2/type_traits:35:0,
from ./RCF-3.0.251/include/RCF/TypeTraits.hpp:22,
from ./RCF-3.0.251/include/RCF/Config.hpp:22,
from ./RCF-3.0.251/src/RCF/RCF.cpp:19:
/usr/include/c++/4.8.2/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
#error This file requires compiler and library support for the \
^
In file included from ./RCF-3.0.251/include/RCF/ThreadPool.hpp:31:0,
from ./RCF-3.0.251/include/RCF/AmiThreadPool.hpp:25,
from ./RCF-3.0.251/src/RCF/AmiThreadPool.cpp:19,
from ./RCF-3.0.251/src/RCF/RCF.cpp:21:
./RCF-3.0.251/include/RCF/ThreadLibrary.hpp:23:24: fatal error: shared_mutex: No such file or directory
#include
由于RCF3.0用到C++17标准,需要用到较新的gcc版本才能编译,不能通过yum update更新,只能下载gcc源码编译安装
5、编译后执行
[root@localhost RCF]# ./ex1_server
Press Enter to exit...
I_PrintService service: Hello World
I_PrintService service: Hello World
I_PrintService service: Hello World
I_PrintService service: Hello World
I_PrintService service: Hello World
I_PrintService service: Hello World
I_PrintService service: Hello World
.
.
.
[root@localhost RCF]# ./ex1_client
Calling the I_PrintService Print() method.
1
2
3
4
.
.
.
9997
9998
9999
6、将RCF编译成静态库,以免每次都要重新编译一遍RCF源码
[root@localhost RCF]# g++ RCF.cpp -c -I ../../include/ -lpthread -ldl -luuid
[root@localhost RCF]# ar rcs libRCF.a RCF.o
[root@localhost RCF]# ls
AmiThreadPool.cpp FileSystem.cpp MemStream.cpp ReallocBuffer.cpp TimedBsdSockets.cpp
AsioHandlerCache.cpp FileTransferService.cpp MethodInvocation.cpp RemoteCallContext.cpp Timer.cpp
AsioServerTransport.cpp Filter.cpp MulticastClientTransport.cpp Schannel.cpp Tools.cpp
Base64.cpp FilterService.cpp NamedPipeEndpoint.cpp SerializationProtocol.cpp UdpClientTransport.cpp
BoostSystem.cpp Future.cpp ObjectPool.cpp ServerObjectService.cpp UdpEndpoint.cpp
BsdClientTransport.cpp Globals.cpp OpenSslEncryptionFilter.cpp ServerStub.cpp UdpServerTransport.cpp
ByteBuffer.cpp HttpClientTransport.cpp PerformanceData.cpp ServerTask.cpp UnixLocalClientTransport.cpp
ByteOrdering.cpp HttpConnectFilter.cpp PeriodicTimer.cpp ServerTransport.cpp UnixLocalEndpoint.cpp
CallbackConnectionService.cpp HttpEndpoint.cpp PingBackService.cpp Service.cpp UnixLocalServerTransport.cpp
Certificate.cpp HttpFrameFilter.cpp Platform.cpp SessionTimeoutService.cpp UsingBsdSockets.cpp
ClientStub.cpp HttpsClientTransport.cpp ProxyEndpoint.cpp SspiFilter.cpp Uuid.cpp
ClientStubLegacy.cpp HttpsEndpoint.cpp ProxyEndpointService.cpp stdafx.cpp Version.cpp
ClientTransport.cpp HttpServerTransport.cpp ProxyEndpointTransport.cpp stdafx.h Win32Certificate.cpp
ConnectedClientTransport.cpp HttpSessionFilter.cpp PublishingService.cpp SubscriptionService.cpp Win32NamedPipeClientTransport.cpp
CurrentSerializationProtocol.cpp HttpsServerTransport.cpp RCF_1.cpp SubscriptionServiceLegacy.cpp Win32NamedPipeEndpoint.cpp
CurrentSession.cpp InitDeinit.cpp RCF_2.cpp Tchar.cpp Win32NamedPipeServerTransport.cpp
DynamicLib.cpp IpAddress.cpp RCF_3.cpp TcpClientTransport.cpp Win32Username.cpp
Enums.cpp IpClientTransport.cpp RcfClient.cpp TcpEndpoint.cpp ZlibCompressionFilter.cpp
ErrorMsg.cpp IpServerTransport.cpp RCF.cpp TcpServerTransport.cpp
Exception.cpp libRCF.a RCF.o ThreadLibrary.cpp
FileIoThreadPool.cpp Log.cpp RcfServer.cpp ThreadLocalData.cpp
FileStream.cpp Marshal.cpp RcfSession.cpp ThreadPool.cpp
[root@localhost RCF]#
现在可以直接通过静态库进行编译
[root@localhost RCF]# g++ ex1_client.c -o ex1_client -I ./RCF-3.0.251/include/ -lpthread -ldl -luuid -lRCF -L.
[root@localhost RCF]#