RPC通信框架——RCF介绍中说了,RCF本身是支持跨平台的,其代码放到Linux平台,是可以通过gcc、make等工具,编译通过的。

官方提供的源码中,只有cmake编译脚本,并没有提供Makefile,如果想直接使用make编译,就必须自己写Makefile。

抛开这些不说,本文主要介绍在Windows系统上,通过VS与VisualGDB来完成Linux版本的RCF库的编译和调试。

使用VS+VisualGDB编译调试Linux程序 ,文中已经简单介绍了VisualGDB的用法,本文直奔主题,介绍RCF静态库的编译方式。

通过向导配置项目

通过向导创建项目时,比较重要的几个步骤如下,

选择项目类型为静态库:

通过Windows共享文件夹以及smb服务的方式在Windows与Linux之前共享代码:

具体命令为:

mount.cifs //192.168.3.125/rcf.linux '/code/rcf' -o user=hbccdf,pass='****',noperm

配置目录结构

配置后的目录结构如下

D:\CODE\C++\RCF.LINUX
├─Debug
├─include
│  ├─RCF
│  │  ├─external
│  │  │  └─asio
│  │  │      └─asio
│  │  │          ├─detail
│  │  │          │  └─impl
│  │  │          ├─impl
│  │  │          ├─ip
│  │  │          │  ├─detail
│  │  │          │  │  └─impl
│  │  │          │  └─impl
│  │  │          ├─local
│  │  │          │  └─detail
│  │  │          │      └─impl
│  │  │          ├─posix
│  │  │          ├─ssl
│  │  │          │  └─detail
│  │  │          └─windows
│  │  ├─test
│  │  ├─thread
│  │  │  └─impl
│  │  ├─utf8
│  │  │  └─detail
│  │  └─util
│  │      └─Platform
│  │          └─OS
│  │              ├─Unix
│  │              └─Windows
│  └─SF
├─rcf.linux
│  ├─Debug
│  │  └─rcf.linux.tlog
│  ├─obj
│  │  └─Win32
│  │      └─Debug
│  └─VisualGDBCache
│      └─rcf.linux-Debug
└─src├─RCF│  ├─test│  └─util└─SF

修改项目配置

通过VisualGDB修改项目配置,也就是Makefile相关配置,也可以通过VS直接改文本内容:

添加RCF源代码

由于RCF的源码全被包含在RCF.cpp文件中,所以,只需要在VS中添加RCF.cpp文件即可:

完成配置并进行编译

至此,就完成了所有的配置,可以通过VS进行编译了,如下是编译信息:

1>------ 已启动生成:  项目: rcf.linux, 配置: Debug Win32 ------
1>  VisualGDB: Testing shared folder-based mapping D:\Code\C++\rcf.linux\rcf.linux <=> 192.168.3.128:/code/rcf/rcf.linux...
1>  VisualGDB: Trying to create D:\Code\C++\rcf.linux\rcf.linux\vgdb1889774204.tmp...
1>  VisualGDB: Run "make CONFIG=Debug" in directory "/code/rcf/rcf.linux" on root@192.168.3.128 (SSH)
1>  g++ -ggdb -ffunction-sections -O0  -I../include -DDEBUG  -c ../src/RCF/RCF.cpp -o Debug/RCF.o -MD -MF Debug/RCF.dep
1>  ar -r Debug/librcf.a Debug/RCF.o
1>  ar: creating Debug/librcf.a
========== 生成:  成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

添加测试程序

通过VisualGDB向导添加测试程序rcftest,

然后进行项目配置:

添加测试代码——通过TCP进行通信

RCF进程间通信Demo程序,文中说了通过RCF进行进程间通信的具体步骤,

首先添加接口 I_HELLO:

#pragma once#include "rcf/rcf.hpp"
#include <iostream>
#include <string>
using namespace std;RCF_BEGIN(I_HELLO, "I_HELLO")RCF_METHOD_V1(void, SayHello, const string&)RCF_METHOD_R1(int, add, int&)RCF_METHOD_V0(void, test)
RCF_END(I_HELLO)class HelloImpl
{
public:void SayHello(const string& world){cout << "hello " << world << endl;}int add(int& a){a = a + a;return a + 2;}void test(){}
};

然后添加测试代码:

#include <iostream>
#include "hello.h"
using namespace std;int main(int argc, char *argv[])
{RCF::RcfInitDeinit rcf_init;HelloImpl hello;RCF::RcfServer server(RCF::TcpEndpoint(50001));server.bind<I_HELLO>(hello);server.start();RcfClient<I_HELLO> client(RCF::TcpEndpoint(50001));string str = "test";client.SayHello(str);int a = 3;int b = client.add(a);cout << "a = " << a << ", b = " << b << endl;for (int i = 0; i < 20000; ++i){client.test();}cout << "完成" << endl;
}

如下是编译信息:

1>------ 已启动生成:  项目: rcftest, 配置: Debug Win32 ------
1>  VisualGDB: Testing shared folder-based mapping D:\Code\C++\rcf.linux\rcftest <=> 192.168.3.128:/code/rcf/rcftest...
1>  VisualGDB: Trying to create D:\Code\C++\rcf.linux\rcftest\vgdb1568095730.tmp...
1>  Updating D:\Code\C++\rcf.linux\rcftest\Makefile
1>  VisualGDB: Updated source file list in D:\Code\C++\rcf.linux\rcftest\Makefile. Enable verbose mode for more details.
1>  VisualGDB: Run "make CONFIG=Debug" in directory "/code/rcf/rcftest" on root@192.168.3.128 (SSH)
1>  g++ -ggdb -ffunction-sections -O0  -I../include -DDEBUG  -c rcftest.cpp -o Debug/rcftest.o -MD -MF Debug/rcftest.dep
1>  g++ -o Debug/rcftest -Wl,-gc-sections   -L../rcf.linux/Debug -Wl,--start-group Debug/rcftest.o -lrcf -lpthread -ldl  -Wl,--rpath='$ORIGIN'   -Wl,--end-group
========== 生成:  成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

运行测试程序并查看测试结果

可以通过VS F5调试运行,查看运行结果:

这样,通过VS+VisualGDB编译RCF的工作就完成了。

VisualGDB生成的所有Makefile代码

虽然是在Windows系统上,使用VS进行编译开发,实际上还是需要生成Makefile文件,然后通过make进行编译。

每个项目会生成几个与项目配置有关的makefile文件,比如debug.mak文件,以及一个与配置无关的文件Makefile,编译的时候会根据配置选择对应的debug.mak或者release.mak。

rcf.linux项目

debug.mak文件:

#Generated by VisualGDB (http://visualgdb.com)
#DO NOT EDIT THIS FILE MANUALLY UNLESS YOU ABSOLUTELY NEED TO
#USE VISUALGDB PROJECT PROPERTIES DIALOG INSTEADBINARYDIR := Debug#Toolchain
CC := gcc
CXX := g++
LD := $(CXX)
AR := ar
OBJCOPY := objcopy#Additional flags
PREPROCESSOR_MACROS := DEBUG
INCLUDE_DIRS := ../include
LIBRARY_DIRS :=
LIBRARY_NAMES := pthread
ADDITIONAL_LINKER_INPUTS :=
MACOS_FRAMEWORKS :=
LINUX_PACKAGES := CFLAGS := -ggdb -ffunction-sections -O0
CXXFLAGS := -ggdb -ffunction-sections -O0
ASFLAGS :=
LDFLAGS := -Wl,-gc-sections
COMMONFLAGS := START_GROUP := -Wl,--start-group
END_GROUP := -Wl,--end-group#Additional options detected from testing the toolchain
IS_LINUX_PROJECT := 1

Makefile文件:

#Generated by VisualGDB project wizard.
#Note: VisualGDB will automatically update this file when you add new sources to the project.
#All other changes you make in this file will be preserved.
#Visit http://visualgdb.com/makefiles for more details

#VisualGDB: AutoSourceFiles        #<--- remove this line to disable auto-updating of SOURCEFILES and EXTERNAL_LIBSTARGETNAME := librcf.a
#TARGETTYPE can be APP, STATIC or SHARED
TARGETTYPE := STATICto_lowercase = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$1))))))))))))))))))))))))))CONFIG ?= DEBUGCONFIGURATION_FLAGS_FILE := $(call to_lowercase,$(CONFIG)).makinclude $(CONFIGURATION_FLAGS_FILE)
include $(ADDITIONAL_MAKE_FILES)ifeq ($(BINARYDIR),)
error:$(error Invalid configuration, please check your inputs)
endifSOURCEFILES := ../src/RCF/RCF.cpp
EXTERNAL_LIBS :=
EXTERNAL_LIBS_COPIED := $(foreach lib, $(EXTERNAL_LIBS),$(BINARYDIR)/$(notdir $(lib)))CFLAGS += $(COMMONFLAGS)
CXXFLAGS += $(COMMONFLAGS)
ASFLAGS += $(COMMONFLAGS)
LDFLAGS += $(COMMONFLAGS)CFLAGS += $(addprefix -I,$(INCLUDE_DIRS))
CXXFLAGS += $(addprefix -I,$(INCLUDE_DIRS))CFLAGS += $(addprefix -D,$(PREPROCESSOR_MACROS))
CXXFLAGS += $(addprefix -D,$(PREPROCESSOR_MACROS))
ASFLAGS += $(addprefix -D,$(PREPROCESSOR_MACROS))CXXFLAGS += $(addprefix -framework ,$(MACOS_FRAMEWORKS))
CFLAGS += $(addprefix -framework ,$(MACOS_FRAMEWORKS))
LDFLAGS += $(addprefix -framework ,$(MACOS_FRAMEWORKS))LDFLAGS += $(addprefix -L,$(LIBRARY_DIRS))ifeq ($(GENERATE_MAP_FILE),1)
LDFLAGS += -Wl,-Map=$(BINARYDIR)/$(basename $(TARGETNAME)).map
endifLIBRARY_LDFLAGS = $(addprefix -l,$(LIBRARY_NAMES))ifeq ($(IS_LINUX_PROJECT),1)RPATH_PREFIX := -Wl,--rpath='$$ORIGIN/../LIBRARY_LDFLAGS += $(EXTERNAL_LIBS)LIBRARY_LDFLAGS += -Wl,--rpath='$$ORIGIN'LIBRARY_LDFLAGS += $(addsuffix ',$(addprefix $(RPATH_PREFIX),$(dir $(EXTERNAL_LIBS))))
    ifeq ($(TARGETTYPE),SHARED)CFLAGS += -fPICCXXFLAGS += -fPICASFLAGS += -fPICLIBRARY_LDFLAGS += -Wl,-soname,$(TARGETNAME)endififneq ($(LINUX_PACKAGES),)PACKAGE_CFLAGS := $(foreach pkg,$(LINUX_PACKAGES),$(shell pkg-config --cflags $(pkg)))PACKAGE_LDFLAGS := $(foreach pkg,$(LINUX_PACKAGES),$(shell pkg-config --libs $(pkg)))CFLAGS += $(PACKAGE_CFLAGS)CXXFLAGS += $(PACKAGE_CFLAGS)LIBRARY_LDFLAGS += $(PACKAGE_LDFLAGS)endif
elseLIBRARY_LDFLAGS += $(EXTERNAL_LIBS)
endifLIBRARY_LDFLAGS += $(ADDITIONAL_LINKER_INPUTS)all_make_files := $(firstword $(MAKEFILE_LIST)) $(CONFIGURATION_FLAGS_FILE) $(ADDITIONAL_MAKE_FILES)ifeq ($(STARTUPFILES),)all_source_files := $(SOURCEFILES)
elseall_source_files := $(STARTUPFILES) $(filter-out $(STARTUPFILES),$(SOURCEFILES))
endifsource_obj1 := $(all_source_files:.cpp=.o)
source_obj2 := $(source_obj1:.c=.o)
source_obj3 := $(source_obj2:.s=.o)
source_obj4 := $(source_obj3:.S=.o)
source_obj5 := $(source_obj4:.cc=.o)
source_objs := $(source_obj5:.cxx=.o)all_objs := $(addprefix $(BINARYDIR)/, $(notdir $(source_objs)))PRIMARY_OUTPUTS :=ifeq ($(GENERATE_BIN_FILE),1)
PRIMARY_OUTPUTS += $(BINARYDIR)/$(basename $(TARGETNAME)).bin
endififeq ($(GENERATE_IHEX_FILE),1)
PRIMARY_OUTPUTS += $(BINARYDIR)/$(basename $(TARGETNAME)).ihex
endififeq ($(PRIMARY_OUTPUTS),)
PRIMARY_OUTPUTS := $(BINARYDIR)/$(TARGETNAME)
endifall: $(PRIMARY_OUTPUTS)$(BINARYDIR)/$(basename $(TARGETNAME)).bin: $(BINARYDIR)/$(TARGETNAME)$(OBJCOPY) -O binary $< $@$(BINARYDIR)/$(basename $(TARGETNAME)).ihex: $(BINARYDIR)/$(TARGETNAME)$(OBJCOPY) -O ihex $< $@ifeq ($(TARGETTYPE),APP)
$(BINARYDIR)/$(TARGETNAME): $(all_objs) $(EXTERNAL_LIBS)$(LD) -o $@ $(LDFLAGS) $(START_GROUP) $(all_objs) $(LIBRARY_LDFLAGS) $(END_GROUP)
endififeq ($(TARGETTYPE),SHARED)
$(BINARYDIR)/$(TARGETNAME): $(all_objs) $(EXTERNAL_LIBS)$(LD) -shared -o $@ $(LDFLAGS) $(START_GROUP) $(all_objs) $(LIBRARY_LDFLAGS) $(END_GROUP)
endififeq ($(TARGETTYPE),STATIC)
$(BINARYDIR)/$(TARGETNAME): $(all_objs)$(AR) -r $@ $^
endif-include $(all_objs:.o=.dep)clean:
ifeq ($(USE_DEL_TO_CLEAN),1)del /S /Q $(BINARYDIR)
elserm -rf $(BINARYDIR)
endif$(BINARYDIR):mkdir $(BINARYDIR)#VisualGDB: FileSpecificTemplates        #<--- VisualGDB will use the following lines to define rules for source files in subdirectories
$(BINARYDIR)/%.o : %.cpp $(all_make_files) |$(BINARYDIR)$(CXX) $(CXXFLAGS) -c $< -o $@ -MD -MF $(@:.o=.dep)$(BINARYDIR)/%.o : %.c $(all_make_files) |$(BINARYDIR)$(CC) $(CFLAGS) -c $< -o $@ -MD -MF $(@:.o=.dep)$(BINARYDIR)/%.o : %.S $(all_make_files) |$(BINARYDIR)$(CC) $(CFLAGS) $(ASFLAGS) -c $< -o $@ -MD -MF $(@:.o=.dep)$(BINARYDIR)/%.o : %.s $(all_make_files) |$(BINARYDIR)$(CC) $(CFLAGS) $(ASFLAGS) -c $< -o $@ -MD -MF $(@:.o=.dep)$(BINARYDIR)/%.o : %.cc $(all_make_files) |$(BINARYDIR)$(CC) $(CFLAGS) $(CXXFLAGS) -c $< -o $@ -MD -MF $(@:.o=.dep)$(BINARYDIR)/%.o : %.cxx $(all_make_files) |$(BINARYDIR)$(CC) $(CFLAGS) $(CXXFLAGS) -c $< -o $@ -MD -MF $(@:.o=.dep)#VisualGDB: GeneratedRules                #<--- All lines below are auto-generated$(BINARYDIR)/RCF.o : ../src/RCF/RCF.cpp $(all_make_files) |$(BINARYDIR)$(CXX) $(CXXFLAGS) -c $< -o $@ -MD -MF $(@:.o=.dep)

rcftest项目:

#Generated by VisualGDB (http://visualgdb.com)
#DO NOT EDIT THIS FILE MANUALLY UNLESS YOU ABSOLUTELY NEED TO
#USE VISUALGDB PROJECT PROPERTIES DIALOG INSTEADBINARYDIR := Debug#Toolchain
CC := gcc
CXX := g++
LD := $(CXX)
AR := ar
OBJCOPY := objcopy#Additional flags
PREPROCESSOR_MACROS := DEBUG
INCLUDE_DIRS := ../include
LIBRARY_DIRS := ../rcf.linux/Debug
LIBRARY_NAMES := rcf pthread dl
ADDITIONAL_LINKER_INPUTS :=
MACOS_FRAMEWORKS :=
LINUX_PACKAGES := CFLAGS := -ggdb -ffunction-sections -O0
CXXFLAGS := -ggdb -ffunction-sections -O0
ASFLAGS :=
LDFLAGS := -Wl,-gc-sections
COMMONFLAGS := START_GROUP := -Wl,--start-group
END_GROUP := -Wl,--end-group#Additional options detected from testing the toolchain
IS_LINUX_PROJECT := 1

Makefile文件:

与rcf.linux项目的Makefile文件基本上是一样的,就不在这里列举了。

转载于:https://www.cnblogs.com/hbccdf/p/use_vs_and_visualgdb_build_rcf.html

使用VS+VisualGDB编译Linux版本RCF相关推荐

  1. 编译Linux版本飞鸽传书的不完全解决办法

     前几天想起在局域网常用的飞鸽传书,想知道在Ubuntu有没有办法运行或者有类似的软件可用,首先想到了Wine,马上Wine一个Windows最新版本的IPMSG,一试就成功了,完美模拟运行. 在 ...

  2. python官网下载步骤linux-官方下载python源码,编译linux版本的python

    我这里使用的时centos7-mini,centos系统本身默认安装有python2.x,版本x根据不同版本系统有所不同,可通过 python --V 或 python --version 查看系统自 ...

  3. 【Linux 内核】编译 Linux 内核 ⑦ ( 安装内核模块 | 安装内核 | 重启系统 | 查看当前内核版本 )

    文章目录 一.安装内核模块 二.安装内核 三.重启系统 四.查看当前内核版本 一.安装内核模块 确保 Linux 内核编译完成 , 没有任何报错之后 ; 参考 [Linux 内核]编译 Linux 内 ...

  4. Ubuntu 14.04 64位升级搜狗拼音输入法linux版本

    今天发现Ubuntu 14.04上的搜狗拼音输入法linux版本被搜狗官网和优麒麟团体升级了,特更新了一下,下面记录了主要过程,方便大家参考: 直接从官网下载最新的deb包 http://pinyin ...

  5. 编译Linux Kernel(linux-4.19.178)并制作成rpm文件

    目录 一.安装依赖项 二.下载.解压缩.制作.config文件 三.编译内核及打包 四.升级内核 首次尝试编译Linux内核,记录过程,提供Linux Kernel(linux-4.19.178)下载 ...

  6. 安装debian总结以及编译linux内核

    1. 安装debian 使用unetbootin(http://unetbootin.sourceforge.net/)来创建启动盘,并且下载debian的基本包. 将磁盘进行压缩操作,并且保留出一个 ...

  7. 编译linux内核步骤

    1.安装内核 如果内核已经安装(/usr/src/目录有linux子目录),跳过 如果没有安装,在光驱中放入linux安装光盘,找到kernel-source-2.xx.xx.rpm文件(xx代表数字 ...

  8. 获取并编译linux源码,android获取源代码、编译、命令

    ---my--- 正确的编译android sdk: cd myandroid . ./build/envsetup.sh lunch sdk-eng make sdk //或者: make PROD ...

  9. 【Linux】一步一步学Linux——Linux版本(03)

    目录 00. 目录 01. Linux内核版本 02. Linux内核官方网站 03. Linux发行版本 04. Linux发行版本介绍 4.1 Ubuntu 4.2 RedHat 4.3 Debi ...

最新文章

  1. 2020年,你读到印象最深的论文是哪篇?
  2. 如何解决SQL Server 2008 R2中“阻止保存要求重新创建表的更改”的问题!
  3. 于计算机交朋友教案,三年级上册信息技术教案-2与计算机交朋友|人教版 (2)
  4. linux三剑客之awk (用于个人学习以及回顾)
  5. redis 备份导出rdb_Redis数据迁移利器之redisshake
  6. 06-Flutter移动电商实战-dio基础_Get_Post请求和动态组件协作
  7. ajax下拉框省市级联动
  8. STM32之SPI从机例程
  9. 一个简单的crontab
  10. java中强制类型转换
  11. 黑帽seo技术大揭秘
  12. linux 防蓝光软件下载,教你如何从Git上checkout指定的文件夹至本地的代码
  13. SATA硬盘在安装OS时注意AHCI模式
  14. 【已解决】 ‘gbk‘ codec can‘t decode byte 0x93 in position 3136: illegal multibyte sequence
  15. java小白日常报错
  16. 如何实现输入银行卡号每隔四位自动添加一个空格的功能?
  17. word 标尺排版使用技巧
  18. python爬虫返回文本为乱码的解决方法
  19. 花仙里云课堂知识付费v1.2.25知识付费 教育 直播
  20. QT使用QMovie播放Gif动画

热门文章

  1. 别被别人抢走了你的时间
  2. 小米手机v3.exo 合并_Android 3.0预览版SDK已发布,eXo启动了Elastic Beanstalk的IDE
  3. 超级详细VM16虚拟机安装CentOS 6.8创建虚拟机
  4. 13.2 用Patsy创建模型
  5. codeforces水题100道 第九题 Codeforces Beta Round #63 (Div. 2) Young Physicist (math)
  6. 机器学习实验二 决策树
  7. 数字信号处理学习笔记[3] 滤波与褶积,Z变换
  8. Codeforces1575 D. Divisible by Twenty-Five(dp)
  9. Element-UI学习之旅-Layout布局
  10. P1129 [ZJOI2007]矩阵游戏 (匈牙利算法)