VC編譯OCCI的解決方案
解決過程中,發(fā)現(xiàn)少有的解決方案也是零星和不詳細的。
我把總結的成果共享一下吧,希望能對后來者有所幫助。
Windows下編譯yield的步驟
2005-7-28
一、??????? 安裝必備軟件
1、??????? 安裝Oracle客戶端,其中會含有oci的庫文件。
2、??????? 安裝MS Visual C++
二、??????? 修改源文件
1、增加接口。在OcciDml.hpp中增加extern "C" int __declspec(dllexport) funA(char* a);?? 在OcciDml.cpp中將函數(shù)聲明修改為extern "C" int __declspec(dllexport) funA(char* a)
2、修改頭文件。在需要引入的所有類中,替換為
#ifndef OCCI_ORACLE
#define WIN32COMMON
#include "occi.h"
using namespace oracle::occi;
using namespace std;
#endif
否則會出現(xiàn)錯誤如下:
d:\oracle\ora92\oci\include\occicontrol.h(1132) : error C2995: 'getVector' : template function has already been defined
d:\oracle\ora92\oci\include\occicommon.h(425) : see declaration of 'getVector'
三、??????? 設置環(huán)境變量
1、??????? 設置INCLUDE,這可以使cl.exe在命令行時執(zhí)行成功
2、??????? 設置LIB,這可以使cl.exe在link時找到庫
四、??????? VC設置環(huán)境
1、??????? 在Tools->Options->Directories->INCLUDE中加入%ORACLE_HOME%/OCI/INCLUDE和%ORACLE_HOME%/PRECOMP/PUBLIC。
2、??????? 在Tools->Options->Directories->Library files中加入%ORACLE_HOME%/OCI/lib/MSVC/VC6和%ORACLE_HOME%/OCI/lib/MSVC和%ORACLE_HOME%/precomp/lib/MSVC
3、在Project->Setting->Link->Input中增加oci.lib,oraocci10d.lib,oraSQL10.lib,msvcrt.lib
4、在Project->Setting->Link->General中選擇”Ignore all default libraries”,然后修改為/NODEFAULTLIB:libcd
5、在Project->Setting->C/C++->Preprocessor中增加WIN32COMMON,_MT,_DLL
否則,會出現(xiàn)ResultSet的getString錯誤。
6、附編譯后日志中的編譯選項為/nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "YIELDDLL_EXPORTS" /D "WIN32COMMON" /D "_MT" /D "_DLL" /FR"Debug/" /Fp"Debug/yielddll.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c
五、設置Oracle的lisener
? 找到lisener.ora,修改為(ENVS="EXTPROC_DLLS=ANY")
六、部署
? 拷貝到oracle的bin目錄下,執(zhí)行create library命令