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

阅读目录

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

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

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

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

回到顶部

通过向导配置项目

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

选择项目类型为静态库:

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

具体命令为:

 Collapse

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

回到顶部

配置目录结构

配置后的目录结构如下

 Collapse

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进行编译了,如下是编译信息:

 Collapse

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 [email protected] (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:

 Collapse

#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()
    {}
};

然后添加测试代码:

 Collapse

#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;
}

如下是编译信息:

 Collapse

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 [email protected] (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文件:

 Collapse

#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文件:

 Collapse

#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 $< [email protected]

$(BINARYDIR)/$(basename $(TARGETNAME)).ihex: $(BINARYDIR)/$(TARGETNAME)
    $(OBJCOPY) -O ihex $< [email protected]

ifeq ($(TARGETTYPE),APP)
$(BINARYDIR)/$(TARGETNAME): $(all_objs) $(EXTERNAL_LIBS)
    $(LD) -o [email protected] $(LDFLAGS) $(START_GROUP) $(all_objs) $(LIBRARY_LDFLAGS) $(END_GROUP)
endif

ifeq ($(TARGETTYPE),SHARED)
$(BINARYDIR)/$(TARGETNAME): $(all_objs) $(EXTERNAL_LIBS)
    $(LD) -shared -o [email protected] $(LDFLAGS) $(START_GROUP) $(all_objs) $(LIBRARY_LDFLAGS) $(END_GROUP)
endif

ifeq ($(TARGETTYPE),STATIC)
$(BINARYDIR)/$(TARGETNAME): $(all_objs)
    $(AR) -r [email protected] $^
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 [email protected] -MD -MF $(@:.o=.dep)

$(BINARYDIR)/%.o : %.c $(all_make_files) |$(BINARYDIR)
    $(CC) $(CFLAGS) -c $< -o [email protected] -MD -MF $(@:.o=.dep)

$(BINARYDIR)/%.o : %.S $(all_make_files) |$(BINARYDIR)
    $(CC) $(CFLAGS) $(ASFLAGS) -c $< -o [email protected] -MD -MF $(@:.o=.dep)

$(BINARYDIR)/%.o : %.s $(all_make_files) |$(BINARYDIR)
    $(CC) $(CFLAGS) $(ASFLAGS) -c $< -o [email protected] -MD -MF $(@:.o=.dep)

$(BINARYDIR)/%.o : %.cc $(all_make_files) |$(BINARYDIR)
    $(CC) $(CFLAGS) $(CXXFLAGS) -c $< -o [email protected] -MD -MF $(@:.o=.dep)

$(BINARYDIR)/%.o : %.cxx $(all_make_files) |$(BINARYDIR)
    $(CC) $(CFLAGS) $(CXXFLAGS) -c $< -o [email protected] -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 [email protected] -MD -MF $(@:.o=.dep)

rcftest项目:

 Collapse

#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文件基本上是一样的,就不在这里列举了。

http://www.cnblogs.com/hbccdf/p/use_vs_and_visualgdb_build_rcf.html

时间: 2024-10-16 01:21:01

使用VS+VisualGDB编译Linux版本RCF(相当于Linux也有COM版本了)的相关文章

使用VS+VisualGDB编译Linux版本RCF

RPC通信框架--RCF介绍中说了,RCF本身是支持跨平台的,其代码放到Linux平台,是可以通过gcc.make等工具,编译通过的. 官方提供的源码中,只有cmake编译脚本,并没有提供Makefile,如果想直接使用make编译,就必须自己写Makefile. 抛开这些不说,本文主要介绍在Windows系统上,通过VS与VisualGDB来完成Linux版本的RCF库的编译和调试. 使用VS+VisualGDB编译调试Linux程序 ,文中已经简单介绍了VisualGDB的用法,本文直奔主题

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

Linux程序开发变得越来越多,越来越多的程序.产品需要跨平台,甚至有些开源项目只支持Linux平台,所以掌握Linux开发变得越来越重要. 但是对于习惯了Windows下的开发,使用了VS这个宇宙第一IDE后,觉得Linux下的纯命令行开发调试,还是有些不习惯,效率有些低(大神除外).那么能不能用VS来开发调试Linux程序呢,经过各种查找,找到了VisualGDB这个神奇的插件,通过VS+VisualGDB就可以编译调试Linux程序. 下面我们来看一下创建demo的过程吧. 配置虚拟机 V

Linux CentOS 7 安装PostgreSQL 9.3(发行版本)

前言 如题,本篇blog记录一下在Linux CentOS 7中安装PostgresSQL的整个过程以及数据库配置等,在Linux系统中,PostgreSQL的安装方式分两种,分别是: 二进制安装包安装 源码编译安装 由于我们没有什么特殊需求所在在此选择较为简单的方式--二进制安装包安装,二进制包安装的方法一般都是通过不同发行版本的Linux下的包管理器进行的,例如Debian和Ubuntu下是使用apt-get命令或aptitude命令来安装,命令如下: sudo apt-get instal

编译内核制作一个小型的linux系统

前言 今天我将会给大家带来如何定制一个属于自己linux系统,也就是编译内核,那为什么要编译内核呢? 内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统管理,决定着系统的性能和稳定性.Linux作为一个自由软件,在广 大爱好者的支持下,内核版本不断更新.新的内核修订了旧内核的bug,并增加了许多新的特性.如果用户想要使用这些新特性,或想根据自己的系统度身定制一 个更高效,更稳定的内核,就需要重新编译内核 对开源操作系统(主要是指Linux)的内核源代码在本机进行

linux中CentOS、Ubuntu、Debian三个版本系统 差别

Linux有非常多的发行版本,从性质上划分,大体分为由商业公司维护的商业版本与由开源社区维护的免费发行版本. 商业版本以Redhat为代表,开源社区版本则以debian为代表.这些版本各有不同的特点,在不同的应用领域发挥着不同的作用,不能一概而论.而绝大多数VPS上只提供开源社区维护的发行版本.下面就这些不同的Linux发行版进行简单的分析. Ubuntu Ubuntu近些年的粉丝越来越多,Ubuntu有着漂亮的用户界面,完善的包管理系统,强大的软件源支持,丰富的技术社区,Ubuntu还对大多数

Maven传递依赖的时候,同名包不同版本的包均会下载,但是编译的时候,只会加载一个高版本的。

描述,在一个Maven项目中,同时依赖了spring-tomcat-weaver  和  struts-core 包,但是spring-tomcat-weaver 需要commons-digester-1.2 struts-core 需要commons-digester-1.8 Pom文件如下: <dependencies> <dependency> <!-- 需要commons-digester-1.2包 --> <groupId>org.springfr

linux系统将python升级到2.7.10版本

linux系统将python升级到2.7.10版本 下载地址: https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz 下载文件到指定目录 [[email protected] ~]# cd /usr/local/ [[email protected] local]# wget https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz --19:12:59--  https:

linux学习笔记一:linux版本查询

最近在部署was时,发现有些命令不能使用,查资料发现不同linux发行版本,部分命令有差异.在部署软件之前要充分了解linux的版本信息,查询版本信息主要有以下几个命令:1.uname,uname-r,uname -a,cat /proc/version  查看系统的内核版本,命令适用于aix,hp_ux等系统:[[email protected] etc]# unameLinux[[email protected] etc]# uname -r2.6.32-220.el6.x86_64[[em

VS2017新建或拷贝项目编译时出现:找不到 Windows SDK 版本8.1.请安装所需的版本的 Windows SDK

VS2017新建或拷贝项目编译时出现:找不到 Windows SDK 版本8.1.请安装所需的版本的 Windows SDK 或者在项目属性页的问题解决方案 解决方法: 右击项目解决方案, 选择:重定解决方案目标. 提示框中,选择SDK版本后点击确定. 原文地址:https://www.cnblogs.com/ming-4/p/11736187.html