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. 没有了SA密码,无法Windows集成身份登录,DBA怎么办?

    一同事反馈SQL无法正常登录了,以前都是通过windows集成身份验证登录进去的(sa密码早忘记了),今天就改了服务器的机器名,现在无论如何都登录不进去. SQL登录时如果采用windows集成身份验 ...

  2. java网络编程2

    在通信双方中,ServerSocket是服务器端负责接收的一方,它负责监听指定端口,其构造函数如下: 1.ServerSocket()  throws IOException;无参构造函数,之所以存在 ...

  3. unix shell命令

    man  commandxx    查看某个命令的使用说明 权限---------------------- chmod o+wx   testfile  给某个目录权限 chmod 777 READ ...

  4. Hive 笔记

    DESCRIBE EXTENDED mydb.employees  DESCRIBE EXTENDED mydb.employees DESCRIBE EXTENDED mydb.employees ...

  5. 2016windows(10) wamp 最简单30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world

    2016最简单windows(10) wamp 30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world thrift是什么 最简单解释 thrift是用来帮助各个编程语 ...

  6. Java 应该跨四个平台

    编程语言从属于操作系统,要统一,就要在根本处统一,要统一的是操作系统,而不是编程语言.你认为是苹果决定苹果树,还是苹果树决定苹果? 编程语言跨操作系统是错误的道路,你见过苹果长在桔子树上的吗?苹果长得 ...

  7. JavaScript-String基础知识

    1.字符串可以0个或多个字符串放在一起:     " ' '    ".'""' . "\"\""       2.写法 ...

  8. 20145216 20145330 《信息安全系统设计基础》 实验五 简单嵌入式WEB 服务器实验

    20145216 20145330 <信息安全系统设计基础> 实验五 简单嵌入式WEB 服务器实验 实验报告封面 实验步骤 1.阅读理解源码 进入/arm2410cl/exp/basic/ ...

  9. Go 语言的基本数据类型

    Go 语言的基本数据类型 0)变量声明 var 变量名字 类型 = 表达式 例: 其中“类型”或“= 表达式”两个部分可以省略其中的一个. 1)根据初始化表达式来推导类型信息 2)默认值初始化为0. ...

  10. SQLServer触发器创建、删除、修改、查看

    一: 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约束. 二: SQL Server为每个触发器 ...