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 INSTEAD BINARYDIR := 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_LIBS TARGETNAME := librcf.a
#TARGETTYPE can be APP, STATIC or SHARED
TARGETTYPE := STATIC to_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 ?= DEBUG CONFIGURATION_FLAGS_FILE := $(call to_lowercase,$(CONFIG)).mak include $(CONFIGURATION_FLAGS_FILE)
include $(ADDITIONAL_MAKE_FILES) ifeq ($(BINARYDIR),)
error:
$(error Invalid configuration, please check your inputs)
endif SOURCEFILES := ../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
endif LIBRARY_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 += -fPIC
CXXFLAGS += -fPIC
ASFLAGS += -fPIC
LIBRARY_LDFLAGS += -Wl,-soname,$(TARGETNAME)
endif ifneq ($(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
else
LIBRARY_LDFLAGS += $(EXTERNAL_LIBS)
endif LIBRARY_LDFLAGS += $(ADDITIONAL_LINKER_INPUTS) all_make_files := $(firstword $(MAKEFILE_LIST)) $(CONFIGURATION_FLAGS_FILE) $(ADDITIONAL_MAKE_FILES) ifeq ($(STARTUPFILES),)
all_source_files := $(SOURCEFILES)
else
all_source_files := $(STARTUPFILES) $(filter-out $(STARTUPFILES),$(SOURCEFILES))
endif source_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
endif ifeq ($(GENERATE_IHEX_FILE),1)
PRIMARY_OUTPUTS += $(BINARYDIR)/$(basename $(TARGETNAME)).ihex
endif ifeq ($(PRIMARY_OUTPUTS),)
PRIMARY_OUTPUTS := $(BINARYDIR)/$(TARGETNAME)
endif all: $(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)
endif ifeq ($(TARGETTYPE),SHARED)
$(BINARYDIR)/$(TARGETNAME): $(all_objs) $(EXTERNAL_LIBS)
$(LD) -shared -o $@ $(LDFLAGS) $(START_GROUP) $(all_objs) $(LIBRARY_LDFLAGS) $(END_GROUP)
endif ifeq ($(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)
else
rm -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 INSTEAD BINARYDIR := 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文件基本上是一样的,就不在这里列举了。

使用VS+VisualGDB编译Linux版本RCF的更多相关文章

  1. 使用VS+VisualGDB编译Linux版本RCF(相当于Linux也有COM版本了)

    阅读目录 通过向导配置项目 配置目录结构 修改项目配置 添加RCF源代码 完成配置并进行编译 添加测试程序 添加测试代码——通过TCP进行通信 运行测试程序并查看测试结果 VisualGDB生成的所有 ...

  2. 关于VS2015支持编译Linux程序的问题

    现状 目前已经发布的VS2015中包括VS2015 Preview 以及 VS2015 CTP6,这两个版本均不支持直接编译C++代码为Linux程序,具体情况可以参考 Visual Studio 2 ...

  3. Win10上编译CoreCLR的Windows和Linux版本

    一.编译环境 首先,不管是Windows还是Linux版本CoreCLR的编译,都是在Windows10上进行的. 二.CoreCLR for Windows 在Windows上做编译怎么能少得了Vi ...

  4. 使用VS+VisualGDB编译调试Linux程序

    Linux程序开发变得越来越多,越来越多的程序.产品需要跨平台,甚至有些开源项目只支持Linux平台,所以掌握Linux开发变得越来越重要. 但是对于习惯了Windows下的开发,使用了VS这个宇宙第 ...

  5. 最稳定 性能最好 的 Linux 版本?

    Ubuntu太他妈不稳定了,简直是一坨屎 CentOS.Ubuntu.Debian三个linux比较异同http://blog.csdn.net/educast/article/details/383 ...

  6. 编译linux内核以及depmod的使用

    转载:http://blog.lmtw.com/b/18215/archives/2010/71074.html depmod(depend module) 功能说明:分析可载入模块的相依性. 语 法 ...

  7. linux —— 编译linux内核

    目录:     0.测试环境 1.获得最新内核源代码  2.编译源代码 3.运行新的内核 0.测试环境: 我的系统 : ubuntu 16.04 LTS (内核版本:4.4.0-36-generic ...

  8. Centos下编译Linux内核

    Linux内核编译是一件简单却费事的事.但是独立的编译linux内核会帮助你很好的理解Linux内核的工作机理. 首先编译linux内核我们需要在当前linux操作系统下安装gcc编译器,因为我是Ce ...

  9. Mac下重新编译Linux内核

    Mac下重新编译Linux内核 操作系统实验,要求添加系统调用并重新编译内核,这里记录一下编译内核的过程 0.下载VirtualBox 博主一直用parallel desk,但因为驱动等问题,在PD上 ...

随机推荐

  1. Js(DOM) 和Jq 对象的相互转换

    JQuery 对象不能使用DOM对象中的方法,同样,Dom对象 不能使用JQuery 中的方法,但有时候 ,我们不得不使用JQuery的方法或者 Dom对象的方法,该怎么办呢? 下面介绍一下 jq对象 ...

  2. [UWP]创建自定义VisualState Trigger

    这篇博客将介绍在UWP程序中如何创建和使用自定义VisualState Trigger. 上一篇博客中介绍了如何使用AdaptiveTrigger.目前UWP内置的StateTrigger只有Adap ...

  3. Axure 自适应视图

    假设B为A的子视图 继承: A更新 文字内容.交互事件.禁用: 位置.尺寸.样式.交互样式 时, B都会继承响应更新变化 B更新 文字内容.交互事件.禁用时,A也会更新 B更新 位置.尺寸.样式.交互 ...

  4. Service and controller in angularJs

    Separation of concern is at the heart while designing an AngularJS application. Your controller must ...

  5. html学习第二天—— 第九、十章——CSS的继承、层叠和特殊性+CSS格式化排版

    继承CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码:如某种颜色应用于p标签,这个颜色设置不仅应用p标签, ...

  6. 关于Telerik RadGridView 数据列拖动后异常的一种情况

    目的: 想实现带有复杂表头(ColumnHeader)的列的动态加载,写了一个用户控件. 问题: 动态加载成功了,显示正常,滚动条也正常,但是一旦进行列的拖动操作之后,程序就挂掉了. 解决尝试: 反复 ...

  7. Vue - 自定义指令

    1.Vue.directive(id,definition)注册一个全局自定义指令,接收两个参数,指令ID以及定义对象 2.钩子函数:将作用域与DOM进行链接,链接函数用来创建可以操作DOM的指令 b ...

  8. npm scripts构建

    管道(|)运算符会将一个命令的输出以流的方式作为另一个命令的输入. 重定向(>)运算符则会将输出重定向到文件. < 将文件内容输入到一个命令 在Unix中,还可以通过“&”运算符同 ...

  9. iOS笔记———数据存储

    应用沙盒:应用文件系统的根目录,每个应用都有独自的沙盒相互:在xcode中可以用NSHomeDirectory()函数,打印当前应用的沙盒根路径. 应用程序包:包含了所有资源文件和执行文件; * Do ...

  10. 【HDU2222】Keywords Search AC自动机

    [HDU2222]Keywords Search Problem Description In the modern time, Search engine came into the life of ...