Linux下gSOAP的安裝及使用及MakeFile 文件的編寫

1、下載gSOAP
	在gSOAP官網中可以找到最新的gSOAP安裝包以及相關的文檔
	gSOAP官網:http://www.cs.fsu.edu/~engelen/soap.html
	gSOAP下載地址:http://sourceforge.net/projects/gsoap2/files/gSOAP/
2、安裝gSOAP
	a、解壓zip壓縮包
	命令:unzip gsoap_2.7.17.zip
	b、進入解壓後生成的文件夾gsoap-2.7
	命令:cd gsoap-2.7/
	c、切換到root用戶
	命令:su
	輸入密碼
	d、配置編譯環境
	在gsoap-2.7/文件夾下有一個configure文件,執行它,自動配置編譯環境
	命令:./configure
	e、編譯連接
	命令:make
	f、安裝gSOAP
	命令:make install
	可用wsdl2h或者soapcpp2查看gSOAP是否已經安裝成功
	用命令whereis gsoap查看gSOAP安裝到的位置
3、編寫calc.h文件
	a、新建一個文件夾calc
		命令:mkdir calc
	b、進入calc
		命令:cd calc
	c、創建文件calc.h,在文件中寫入以下內容,保存
		//gsoap ns service name: calc Simple calculator service
		//gsoap ns service style: rpc
		//gsoap ns service encoding: encoded
		//gsoap ns service namespace: http://localhost/calc.wsdl
		//gsoap ns service location: http://localhost/server.cgi
		//gsoap ns schema namespace: urn:calc
		int ns__add(double a, double b, double *result);
		int ns__sub(double a, double b, double *result);
		int ns__mul(double a, double b, double *result);
		int ns__div(double a, double b, double *result);
		int ns__pow(double a, double b, double *result);

	注意:
		a、以上的幾行註釋中,gsoap ns service不能刪除,但可以修改
		b、ns__add等的ns後面是兩個下劃線
4、調用soapcpp2自動生成相關的文件
	(爲了方便代碼管理,在calc文件夾下新建一個soap)
	當前工作目錄爲calc/soap
	命令:soapcpp2 -i ../calc.h
	
	注意:
		可能會報錯,一般是不知道gsoap相關include文件的位置,可以使用
		命令soapcpp2 -i ../calc.h -I /usr/include/gsoap
5、編寫服務器端代碼:server.cpp
	當前工作目錄:calc
	#include "soap/soapcalcService.h"
	#include <iostream>
	using namespace std;

	int main(int argc, char **argv) {
		calcService calc;
		int port = 65531;

		if (calc.run(port)) {
			cerr << "Calc service run failed" << endl;
			exit(0);
		}
		return 0;
	}

	int calcService::add(double a, double b, double* result) {
		*result = a + b;
		return SOAP_OK;
	}

	int calcService::sub(double a, double b, double* result) {
		*result = a - b;
		return SOAP_OK;
	}

	int calcService::mul(double a, double b, double* result) {
		*result = a * b;
		return SOAP_OK;
	}

	int calcService::div(double a, double b, double* result) {
		if (b) {
			*result = a / b;
		} else {
			return SOAP_FAULT;
		}
		return SOAP_OK;
	}

	int calcService::pow(double a, double b, double *result) {
		*result = ::pow(a, b);
		if (soap_errno == EDOM) {
			char *s = (char*) soap_malloc(this, 1024);
			sprintf(s, "Can't take the power of %f to %f", a, b);
			sprintf(s,"<error xmlns=\"http://tempuri.org/\">Can't take power of %f to %f</error>",a, b);
			return SOAP_FAULT;
		}
		return SOAP_OK;
	}

6、編寫客戶端代碼:client.cpp
	#include "soap/soapcalcProxy.h"
	#include "soap/calc.nsmap"
	#include <iostream>
	using namespace std;

	int main(int argc, char **argv) {
		double a = 4;
		double b = 2;
		double result;
		calcProxy calc;
		calc.soap_endpoint = "http://localhost:65531";
		calc.add(a,b,&result);
		cout<<a<<"+"<<b<<"="<<result<<endl;
		calc.sub(a,b,&result);
		cout<<a<<"-"<<b<<"="<<result<<endl;
		calc.mul(a,b,&result);
		cout<<a<<"*"<<b<<"="<<result<<endl;
		calc.div(a,b,&result);
		cout<<a<<"/"<<b<<"="<<result<<endl;
		calc.pow(a,b,&result);
		cout<<a<<"^"<<b<<"="<<result<<endl;
		return 0;
	}

7、編寫Makefile文件:makefile、sources.mk、subdir.mk、soap/subdir.mk、objects.mk
	新建bin文件夾
	當前工作目錄:calc/bin
	#文件:makefile
	RM := rm -rf

	# 引入相關的生成文件
	-include sources.mk
	-include subdir.mk
	-include soap/subdir.mk
	-include objects.mk

	ifneq ($(MAKECMDGOALS),clean)
	ifneq ($(strip $(C++_DEPS)),)
	-include $(C++_DEPS)
	endif
	ifneq ($(strip $(C_DEPS)),)
	-include $(C_DEPS)
	endif
	ifneq ($(strip $(CC_DEPS)),)
	-include $(CC_DEPS)
	endif
	ifneq ($(strip $(SERVER_CPP_DEPS)),)
	-include $(SERVER_CPP_DEPS)
	endif
	ifneq ($(strip $(CLIENT_CPP_DEPS)),)
	-include $(CLIENT_CPP_DEPS)
	endif
	ifneq ($(strip $(CXX_DEPS)),)
	-include $(CXX_DEPS)
	endif
	ifneq ($(strip $(C_UPPER_DEPS)),)
	-include $(C_UPPER_DEPS)
	endif
	endif

	# 生成目標
	all: server client

	# 相關工具
	server: $(SERVER_OBJS) $(USER_OBJS)
		@echo '創建目標: $@'
		g++  -o"server" $(SERVER_OBJS) $(USER_OBJS) $(LIBS)
		@echo '完成創建目標: $@'
		@echo "\n"

	client: $(CLIENT_OBJS) $(USER_OBJS)
		@echo '創建目標: $@'
		g++  -o"client" $(CLIENT_OBJS) $(USER_OBJS) $(LIBS)
		@echo '完成創建目標: $@'
		@echo "\n"

	# 清空臨時文件
	clean:
		-$(RM) $(SERVER_OBJS)$(CLIENT_OBJS)$(C++_DEPS)$(C_DEPS)$(CC_DEPS)$(SERVER_CPP_DEPS)$(CLIENT_CPP_DEPS)$(EXECUTABLES)$(CXX_DEPS)$(C_UPPER_DEPS)
		-@echo "\n"
	cleanall:
		-$(RM) $(SERVER_OBJS)$(CLIENT_OBJS)$(C++_DEPS)$(C_DEPS)$(CC_DEPS)$(SERVER_CPP_DEPS)$(CLIENT_CPP_DEPS)$(EXECUTABLES)$(CXX_DEPS)$(C_UPPER_DEPS) server client
		-@echo "\n"
	cleanexe:
		-$(RM) server client
		-@echo "\n"

	.PHONY: all clean dependents cleanall cleanexe
=====================================================================================================
	#文件:sources.mk
	O_SRCS := 
	SERVER_CPP_SRCS := 
	CLIENT_CPP_SRCS :=
	C_UPPER_SRCS := 
	C_SRCS := 
	S_UPPER_SRCS := 
	OBJ_SRCS := 
	ASM_SRCS := 
	CXX_SRCS := 
	C++_SRCS := 
	CC_SRCS := 
	SERVER_OBJS := 
	CLIENT_OBJS :=
	C++_DEPS := 
	C_DEPS := 
	CC_DEPS := 
	SERVER_CPP_DEPS := 
	CLIENT_CPP_SRCS :=
	EXECUTABLES := 
	CXX_DEPS := 
	C_UPPER_DEPS := 

	# 子目錄
	SUBDIRS := \
	soap \
	. \
=====================================================================================================
	#文件:sources.mk
	O_SRCS := 
	SERVER_CPP_SRCS := 
	CLIENT_CPP_SRCS :=
	C_UPPER_SRCS := 
	C_SRCS := 
	S_UPPER_SRCS := 
	OBJ_SRCS := 
	ASM_SRCS := 
	CXX_SRCS := 
	C++_SRCS := 
	CC_SRCS := 
	SERVER_OBJS := 
	CLIENT_OBJS :=
	C++_DEPS := 
	C_DEPS := 
	CC_DEPS := 
	SERVER_CPP_DEPS := 
	CLIENT_CPP_SRCS :=
	EXECUTABLES := 
	CXX_DEPS := 
	C_UPPER_DEPS := 

	# 子目錄
	SUBDIRS := \
	soap \
	. \
	
=====================================================================================================
	#文件:subdir.mk
	# 生成的相關參數
	SERVER_CPP_SRCS += \
	../server.cpp

	SERVER_OBJS += \
	./server.o 

	SERVER_CPP_DEPS += \
	./server.d 

	CLIENT_CPP_SRCS += \
	../client.cpp

	CLIENT_OBJS += \
	./client.o 

	CLIENT_CPP_DEPS += \
	./client.d 

	# 根據.cpp文件生成.o文件
	%.o: ../%.cpp
		@echo '創建目標: $<'
		g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
		@echo '完成創建目標: $<'
		@echo "\n"
=====================================================================================================
	#文件:soap/subdir.mk
	# 生成的相關參數
	SERVER_CPP_SRCS += \
	../soap/soapC.cpp \
	../soap/soapcalcService.cpp \
	/usr/include/gsoap/stdsoap2.cpp

	SERVER_OBJS += \
	./soap/soapC.o \
	./soap/soapcalcService.o \
	./soap/stdsoap2.o

	SERVER_CPP_DEPS += \
	./soap/soapC.d \
	./soap/soapcalcService.d \
	./soap/stdsoap2.d 

	CLIENT_CPP_SRCS += \
	../soap/soapC.cpp \
	../soap/soapcalcProxy.cpp \
	/usr/include/gsoap/stdsoap2.cpp

	CLIENT_OBJS += \
	./soap/soapC.o \
	./soap/soapcalcProxy.o \
	./soap/stdsoap2.o

	CLIENT_CPP_DEPS += \
	./soap/soapC.d \
	./soap/soapcalcProxy.d \
	./soap/stdsoap2.d 

	# 根據.cpp文件生成.o文件
	soap/%.o: ../soap/%.cpp
		@echo '創建目標: $<'
		g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
		@echo '完成創建目標: $<'
		@echo "\n"

	soap/%.o:/usr/include/gsoap/%.cpp
		@echo '創建目標: $<'
		g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
		@echo '完成創建目標: $<'
		@echo "\n"
=====================================================================================================
	#文件:objects.mk
	USER_OBJS :=

	LIBS :=
8、編譯
	當前工作目錄:calc/bin
	make
9、開啓服務端
	./server
10、開啓客戶端
	./client
11、文件總覽(3個目錄, 42個文件)
	calc						// 根目錄
	|-- bin						// 文件夾,存放makefile,以及生成的.o、.d、可執行文件
	|   |-- client
	|   |-- client.d
	|   |-- client.o
	|   |-- makefile
	|   |-- objects.mk
	|   |-- server
	|   |-- server.d
	|   |-- server.o
	|   |-- soap
	|   |   |-- soapcalcProxy.d
	|   |   |-- soapcalcProxy.o
	|   |   |-- soapcalcService.d
	|   |   |-- soapcalcService.o
	|   |   |-- soapC.d
	|   |   |-- soapC.o
	|   |   |-- stdsoap2.d
	|   |   |-- stdsoap2.o
	|   |   `-- subdir.mk
	|   |-- sources.mk
	|   `-- subdir.mk
	|-- calc.h					// calc.h
	|-- client.cpp				// 客戶端
	|-- server.cpp				// 服務器端
	`-- soap					// 該文件夾存放命令soapcpp2 -i ../calc.h生成的文件
		|-- calc.add.req.xml
		|-- calc.add.res.xml
		|-- calc.div.req.xml
		|-- calc.div.res.xml
		|-- calc.mul.req.xml
		|-- calc.mul.res.xml
		|-- calc.nsmap
		|-- calc.pow.req.xml
		|-- calc.pow.res.xml
		|-- calc.sub.req.xml
		|-- calc.sub.res.xml
		|-- calc.wsdl
		|-- ns.xsd
		|-- soapcalcProxy.cpp
		|-- soapcalcProxy.h
		|-- soapcalcService.cpp
		|-- soapcalcService.h
		|-- soapC.cpp
		|-- soapH.h
		`-- soapStub.h
 轉自 http://blog.163.com/wupengzhi2005@126/blog/static/17101002201072121336803/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章