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.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.dep1> ar -r Debug/librcf.a Debug/RCF.o1> ar: creating Debug/librcf.a========== 生成: 成功 1 個,失敗 0 個,最新 0 個,跳過 0 個 ==========添加測試程序
通過VisualGDB向導添加測試程序rcftest,
然后進行項目配置:

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/Makefile1> 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.dep1> 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#ToolchainCC := gccCXX := g++LD := $(CXX)AR := arOBJCOPY := objcopy#Additional flagsPREPROCESSOR_MACROS := DEBUGINCLUDE_DIRS := ../includeLIBRARY_DIRS := LIBRARY_NAMES := pthreadADDITIONAL_LINKER_INPUTS := MACOS_FRAMEWORKS := LINUX_PACKAGES := CFLAGS := -ggdb -ffunction-sections -O0CXXFLAGS := -ggdb -ffunction-sections -O0ASFLAGS := LDFLAGS := -Wl,-gc-sectionsCOMMONFLAGS := START_GROUP := -Wl,--start-groupEND_GROUP := -Wl,--end-group#Additional options detected from testing the toolchainIS_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 SHAREDTARGETTYPE := 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.cppEXTERNAL_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)).mapendifLIBRARY_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)endifLIBRARY_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))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)).binendififeq ($(GENERATE_IHEX_FILE),1)PRIMARY_OUTPUTS += $(BINARYDIR)/$(basename $(TARGETNAME)).ihexendififeq ($(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)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 INSTEADBINARYDIR := Debug#ToolchainCC := gccCXX := g++LD := $(CXX)AR := arOBJCOPY := objcopy#Additional flagsPREPROCESSOR_MACROS := DEBUGINCLUDE_DIRS := ../includeLIBRARY_DIRS := ../rcf.linux/DebugLIBRARY_NAMES := rcf pthread dlADDITIONAL_LINKER_INPUTS := MACOS_FRAMEWORKS := LINUX_PACKAGES := CFLAGS := -ggdb -ffunction-sections -O0CXXFLAGS := -ggdb -ffunction-sections -O0ASFLAGS := LDFLAGS := -Wl,-gc-sectionsCOMMONFLAGS := START_GROUP := -Wl,--start-groupEND_GROUP := -Wl,--end-group#Additional options detected from testing the toolchainIS_LINUX_PROJECT := 1
Makefile文件:
與rcf.linux項目的Makefile文件基本上是一樣的,就不在這里列舉了。
新聞熱點
疑難解答