1、背景
2013年8月1日,telnet手持要求添加新功能,新接手这个makefile,对先前的makefile不甚了解加上客户那边使用的是curses,我在ubuntu上使用的是后来的ncurses,使用方法虽然一致,但是头文件不太相同,编译方法也有区别,于是花气力在这台烂机器上安装虚拟机继而安装oracle、ncurses,然后重新写下这个makefile文件。建议后来人找台好点的机器,oracle客户和服务端全部安装,比单独安装客户端省事太多了(全部安装对内存大小有限制)心得:工欲善其事必先利其器(去年买了个表,真想踩死这台烂电脑),你们能想象的到配置环境比开发时间都长?
2、curses /ncurses环境配置
curses就是一套兼容性强的显示库(字符显示,就像控制台或者终端)介绍就不说了
安装ncurses,终端里输入:
1、sudo apt-get update
2、apt-get install libncurses5-dev libncurses5 libncurses5-dbg (记得好像还要安装ncursesw版本的)
在home目录里新建文件夹curses_test,然后新建test.c、makefile,内容如下:
//test.c
#include </usr/include/ncursesw/ncurses.h>
#include <locale.h>
int main()
{
setlocale(LC_ALL,"");
initscr();
printw("Hello World!!用户_密码");
mvaddstr(0,30,"中温暖");
refresh();
getch();
endwin();
return 0;
}
#makefile
#Source file
SRC = test.c
#Object file
OBJ = $(SRC:.c=.o)
#Output execution file
PROGRAM = test
#Compiler
CC = cc
#Include
INCLUDE = -I/usr/include/ncursesw
#Linker Parameter
LINKPARAM = -lncursesw -lpthread
#Options for development
#CFLAGS = -g
#Options for release
CFLAGS = -o
all: $(PROGRAM)
$(PROGRAM): $(OBJ)
$(CC) $(CFLAGS) $(PROGRAM) $(LINKPARAM) $(OBJ)
.SUFFIXES : .c.o
.c.o:
$(CC) $(INCLUDE) $(CFLAGS) $@ $^ -c
clean:
-rm *.o
然后,终端进入curses_test,输入,make clean && make && ./test,程序运行后如果中文没有乱码,说明curses环境配置通过。make clean 清除中间文件,make编译链接生成可执行文件,./test运行当前目录下的test程序。注意头文件的ncursesw,宽字符的才能显示中文。注意编译选项-ncursesw
3、oracle安装
运行安装文件时,加上LANGU=en_US ./runInstaller 可解决安装向导中文乱码问题;
安装的过程,网上找一下,涉及环境变量以及缺少开发包的安装;
安装完毕后,添加tns;
使用sqlplus username/password@dbname登陆数据库,成功则说明OK;
使用Proc预编译pc文件,简单说pc文件是我们编写用来查询执行sql的,Proc负责将我们的PC文件预编译成.c文件,方便我们程序连接数据库。具体介绍问度娘。
在home下,新建proc_test文件夹,创建main.pc,makefile,内容如下:
//main.pc #include "sqlca.h" #include <stdio.h> #include <string.h> #include <stdlib.h> void sql_error(char *msg) { printf("/n%s %s/n", msg,(char *)sqlca.sqlerrm.sqlerrmc); EXEC SQL ROLLBACK RELEASE; exit(0); } int main() { EXEC SQL INCLUDE sqlca; EXEC ORACLE OPTION (RELEASE_CURSOR = YES); EXEC SQL WHENEVER SQLERROR DO sql_error(" <ERROR> "); EXEC SQL BEGIN DECLARE SECTION; VARCHAR oraCN[30]; EXEC SQL END DECLARE SECTION; strcpy(oraCN.arr,"ctplan/ok@tserver5"); oraCN.len = strlen(oraCN.arr); oraCN.arr[oraCN.len]='/0'; EXEC SQL CONNECT :oraCN; printf("/n [OK Connected!] "); return 0; }
#makefile
#Source file
SRC = main.c
#Object file
OBJ = $(SRC:.c=.o)
#Output execution file
PROGRAM = main
#Compiler
CC = gcc
#Include
INCLUDE = -I/opt/ora10/precomp/public
#Linker Parameter
LINKPARAM = -L/opt/ora10/lib -lclntsh
#Options for development
#CFLAGS = -g
#Options for release
CFLAGS = -o
all: $(PROGRAM)
$(PROGRAM): $(OBJ)
$(CC) -o $(PROGRAM) $(LINKPARAM) $(OBJ)
.SUFFIXES : .c
.c.o:
$(CC) $(INCLUDE) $(CFLAGS) $@ $^ -c
clean:
-rm *.o
终端进入,该目录,输入make clean && make && ./main,运行显示OK Connected!说明Proc环境通过
4、中文乱码问题
程序,中文显示还是乱码,这是因为终端编码问题
http://bbs.chinaunix.net/thread-2305193-1-1.html
<a data-cke-saved-href="http://blog.163.com/wangdong8213@126/blog/static/458523662013311103935992/" href="http://blog.163.com/wangdong8213@126/blog/static/458523662013311103935992/">http://blog.163.com/wangdong8213@126/blog/static/458523662013311103935992/</a>
winxP telnet到ubuntu上,中文乱码,可以使用putty
5、项目完整的Makefile
#Source file
SRC = cthandset.c ctdb.c zbutton.c
#Object file
OBJ = $(SRC:.c=.o)
#Output execution file
PROGRAM = hand
#Compiler
CC = gcc
#Include
INCLUDE = -I/opt/ora10/precomp/public -I/usr/include/ncursesw -I/usr/include/
#Linker Parameter
LINKPARAM = -lncursesw -L/opt/ora10/lib -lclntsh
#Options for development
//CFLAGS = -g
#Options for release
CFLAGS = -o
#Proc Set
USERID=ct123/123@tservertest
PROC_FLAGS= sqlcheck=SEMANTICS userid=$(USERID) DBMS=V8 UNSAFE_NULL=YES
all: $(PROGRAM)
$(PROGRAM): $(OBJ)
$(CC) $(CFLAGS) $(PROGRAM) $(LINKPARAM) $(OBJ)
ctdb.c:
proc $(PROC_FLAGS) iname=ctdb.pc
.SUFFIXES : .c.o
.c.o:
$(CC) $(INCLUDE) $(CFLAGS) $@ $^ -c
clean:
-rm *.o ctdb.c tp*