使用VS+VisualGDB编译Linux版本RCF
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相关推荐
- 编译Linux版本飞鸽传书的不完全解决办法
前几天想起在局域网常用的飞鸽传书,想知道在Ubuntu有没有办法运行或者有类似的软件可用,首先想到了Wine,马上Wine一个Windows最新版本的IPMSG,一试就成功了,完美模拟运行. 在 ...
- python官网下载步骤linux-官方下载python源码,编译linux版本的python
我这里使用的时centos7-mini,centos系统本身默认安装有python2.x,版本x根据不同版本系统有所不同,可通过 python --V 或 python --version 查看系统自 ...
- 【Linux 内核】编译 Linux 内核 ⑦ ( 安装内核模块 | 安装内核 | 重启系统 | 查看当前内核版本 )
文章目录 一.安装内核模块 二.安装内核 三.重启系统 四.查看当前内核版本 一.安装内核模块 确保 Linux 内核编译完成 , 没有任何报错之后 ; 参考 [Linux 内核]编译 Linux 内 ...
- Ubuntu 14.04 64位升级搜狗拼音输入法linux版本
今天发现Ubuntu 14.04上的搜狗拼音输入法linux版本被搜狗官网和优麒麟团体升级了,特更新了一下,下面记录了主要过程,方便大家参考: 直接从官网下载最新的deb包 http://pinyin ...
- 编译Linux Kernel(linux-4.19.178)并制作成rpm文件
目录 一.安装依赖项 二.下载.解压缩.制作.config文件 三.编译内核及打包 四.升级内核 首次尝试编译Linux内核,记录过程,提供Linux Kernel(linux-4.19.178)下载 ...
- 安装debian总结以及编译linux内核
1. 安装debian 使用unetbootin(http://unetbootin.sourceforge.net/)来创建启动盘,并且下载debian的基本包. 将磁盘进行压缩操作,并且保留出一个 ...
- 编译linux内核步骤
1.安装内核 如果内核已经安装(/usr/src/目录有linux子目录),跳过 如果没有安装,在光驱中放入linux安装光盘,找到kernel-source-2.xx.xx.rpm文件(xx代表数字 ...
- 获取并编译linux源码,android获取源代码、编译、命令
---my--- 正确的编译android sdk: cd myandroid . ./build/envsetup.sh lunch sdk-eng make sdk //或者: make PROD ...
- 【Linux】一步一步学Linux——Linux版本(03)
目录 00. 目录 01. Linux内核版本 02. Linux内核官方网站 03. Linux发行版本 04. Linux发行版本介绍 4.1 Ubuntu 4.2 RedHat 4.3 Debi ...
最新文章
- 2020年,你读到印象最深的论文是哪篇?
- 如何解决SQL Server 2008 R2中“阻止保存要求重新创建表的更改”的问题!
- 于计算机交朋友教案,三年级上册信息技术教案-2与计算机交朋友|人教版 (2)
- linux三剑客之awk (用于个人学习以及回顾)
- redis 备份导出rdb_Redis数据迁移利器之redisshake
- 06-Flutter移动电商实战-dio基础_Get_Post请求和动态组件协作
- ajax下拉框省市级联动
- STM32之SPI从机例程
- 一个简单的crontab
- java中强制类型转换
- 黑帽seo技术大揭秘
- linux 防蓝光软件下载,教你如何从Git上checkout指定的文件夹至本地的代码
- SATA硬盘在安装OS时注意AHCI模式
- 【已解决】 ‘gbk‘ codec can‘t decode byte 0x93 in position 3136: illegal multibyte sequence
- java小白日常报错
- 如何实现输入银行卡号每隔四位自动添加一个空格的功能?
- word 标尺排版使用技巧
- python爬虫返回文本为乱码的解决方法
- 花仙里云课堂知识付费v1.2.25知识付费 教育 直播
- QT使用QMovie播放Gif动画
热门文章
- 别被别人抢走了你的时间
- 小米手机v3.exo 合并_Android 3.0预览版SDK已发布,eXo启动了Elastic Beanstalk的IDE
- 超级详细VM16虚拟机安装CentOS 6.8创建虚拟机
- 13.2 用Patsy创建模型
- codeforces水题100道 第九题 Codeforces Beta Round #63 (Div. 2) Young Physicist (math)
- 机器学习实验二 决策树
- 数字信号处理学习笔记[3] 滤波与褶积,Z变换
- Codeforces1575 D. Divisible by Twenty-Five(dp)
- Element-UI学习之旅-Layout布局
- P1129 [ZJOI2007]矩阵游戏 (匈牙利算法)