编译链接过程

假设用户已经用嵌入式SQL语言编辑好一个文件test.pc, 我们以此为例说明esql*C的执行过程。

首先,用户需要确定已经安装了神通数据库套件的嵌入式SQL组件。 安装过程见《神通数据库安装手册》。 假定用户把神通数据库套件或者某些组件(要使用嵌入式SQL组件, 则至少必须安装嵌入式SQL组件)安装在X:盘的神通数据库目录下, 那么预处理程序esqlpc位于神通数据库目录的bin子目录下。 其中,X:是一个逻辑盘符,比如C:、D:或者E:等等。

在WINDOWS环境下,库文件位于神通数据库目录的esqlpc/win32和esqlpc/win64子目录下, 和用户开发有关的库文件为动态库的符号输入库esql.lib。 ESQL系统依赖的网络链接库文件onet.lib在onet对应的目录下。 和应用程序运行有关的动态库文件esql.dll和onet.dll位于神通数据库目录的bin子目录下。

在LINUX环境下。动态库文件libesql.so和libonet.so位于神通数据库目录的bin子目录下。

头文件位于神通数据库目录的esqlpc子目录的include子目录下, 包括以下6个文件:

esqlerrno.h
主要是一些和错误处理有关的宏定义;
esqllib.h
主要是本系统库的输出函数的声明;
esqltype.h
主要定义了系统内部处理的变量类型和描述符对列的描述项目,以及一些大对象操作;
sql3types.h
主要定义了动态SQL语句中处理的一般类型码和日期时间类型码;
sqlca.h
定义了一个SQLCA结构,详情参见 错误处理
unistd.h
这是为了和WINDOWS环境兼容而加的。

用户对于头文件内容并不需要太多了解,也不需要费心斟酌应该加入哪个头文件到源文件中, 因为ESQL系统会对此自动做出处理。

安装神通数据库套件或部分软件成功后,会在操作系统中注册相应的环境变量。 其中,最重要的是SZ_OSCAR_HOME,它代表X:盘下的神通数据库目录, 用$SZ_OSCAR_HOME就表示该目录。

编译链接的环境确定后,就可以正式进入编译链接过程。 ESQL系统支持WINDOWS环境和LINUX环境下的版本, 在两个版本下进行编译链接的工具和格式有所不同。

WINDOWS环境

命令行方式

第一步 预编译。

这一步的主要工作是把test.pc文件作为源文件, esql*C预编译程序esqlpc解析该文件,把C语言编写的语句原样输出到目标文件; 而对于其中嵌入的ESQL语句,将其转换为对ESQL系统库提供的接口函数的调用, 如果用户没有用-o选项设置目标文件的名字,那么生成的目标文件名为test.c。 这一步执行下面的命令:

esqlpc test.pc

执行该命令时,如果出现找不到头文件的提示信息, 则需要用-I参数指定所包含头文件的路径:

esqlpc -I%SZ_OSCAR_HOME%/esqlpc/include test.pc

第二步 编译链接C程序。

这一步的工作就是把第一步生成的目标C文件用C语言编译工具进行编译, 并且链接必要的库,生成可执行文件。

如果使用cl编译器的命令行来生成可执行文件,则可以通过下面的命令生成可执行文件:

cl /c /I %SZ_OSCAR_HOME%\\esqlpc\\include /I %SZ_OSCAR_HOME%\\onet
/D "WIN32" test.c

link esql.lib onet.lib /libpath:"%SZ_OSCAR_HOME%\\esqlpc\\win32"
/libpath:"%SZ_OSCAR_HOME%\\onet\\win32\\dll" /out:"test.exe" test.obj

第一步,VC编译器cl把test.c文件作为源文件,编译并生成test.obj目标文件, /I选项指定头文件所在的目录,/c表明只编译,不链接。 第二步VC链接器把目标文件test.obj和库文件进行链接, 生成可执行文件test.exe,/libpath:指定库文件所在的目录, /out:指定可执行文件所在的目录和可执行文件的名字, 这里假定目标文件将位于X:盘的test子目录下。当然,这两步也可以一起完成:

cl /I %SZ_OSCAR_HOME%\esqlpc\include /I %SZ_OSCAR_HOME%\onet /DWIN32 test.c /Fe"test.exe" /link esql.lib onet.lib /libpath:"%SZ_OSCAR_HOME%\esqlpc\win32" /libpath:"%SZ_OSCAR_HOME%\onet\win32\dll"

注解

cl编译器和link链接器的选项以及具体的使用方法请参考VC集成开发环境的帮助手册。

注解

本手册的示例都缺省选择ESQL系统动态库和ESQL系统依赖的网络连接库ONET的动态库。如果需要使用静态库,请更改库的名字。

我们建议您链接时统一使用的库,也就是都使用动态库或者都使用静态库。使用动态库的优势在于可执行文件目标代码所占空间小,但是必须在已经安装神通数据库的ESQL组件的系统上才能运行。 使用静态库的优势在于,即使在没有安装神通数据库ESQL组件的系统上也可以运行,但是它的可执行文件的目标代码所占空间比较大。

注解

关于动态库和静态库的知识,请参考《WINDOWS核心编程》。

VC集成开发环境

在使用VC集成开发环境来开发ESQL应用程序时,用户首先必须根据需要生成一个新的工程。生成工程的过程中,VC软件会提醒用户是否选择加入已有的工作区,如果不加入已有的工作区,VC集成环境会自动为该工程生成一个新的以该工程名字命名的工作区。然后,用户必须设置一个预编译和编译链接的便捷的开发环境。

用户可以用以下两种方式把预编译程序集成到VC集成开发环境中去。

第一种方法,把预编译程序esqlpc作为一个工具集成到VC集成开发环境中去。

打开VC软件,从Tools菜单中选择Customize选项,选择Tools选项卡,出现工具设置窗口。双击Menu contents底部的空拦或者单击右上角的新建工具图标,在出现的编辑栏中输入工具名字,这里我们输入esqlpc。然后,在Command的编辑栏输入esqlpc所在的目录和名称,比如X:\oscar\bin\esqlpc.exe;在Arguments编辑栏输入参数,比如-IX:\oscar\esqlpc\include $(TargetName).pc或者$(SZ_OSCAR_HOME)\esqlpc\include $(TargetName).pc;在Init a directory编辑栏输入$(WkspDir)。工具设置把当前工程的目录作为工作目录,只有该目录下和工程名相同的,并且扩展名为.pc的文件才会被esqlpc工具处理,生成.c文件。点击Close关闭Customize窗口。

这样就已经成功设置esqlpc为一个VC的集成工具。用户从Tools菜单选择esqlpc工具,$(TargetName)把当前开发的工程名传递给esqlpc,然后esqlpc工具用指定的Arguments在工作目录下生成$(TargetName).c文件。详细的设置工具选项的信息请参见1.4小节,''预编译命令''和VC的帮助手册中关于集成工具设置的部分。

设置完成后,esqlpc工具对所有的工程都可见。

注解

这里我们用Microsoft Visual C++ 6.0版本作为VC集成开发环境的范例,如果是其它版本,可能菜单和选项会有所不同。

然后,打开Project菜单的Add To Project子菜单的Files选项窗口,选择刚才生成的.c文件,点击OK把.c文件加入工程。

选择Project菜单的Settings子菜单,打开Project Settings窗口,在Settings For中选择相应的工程和版本(Debug或者Release版本),选择Link选项卡,在Category的下拉菜单中选择Input,并且在Object/library modules的编辑栏中输入所需要的库名:onet.lib和esql.lib,并且在Additional library directories编辑栏中加入$(SZ_OSCAR_HOME)\lib。

选择C/C++选项卡,在Category下拉菜单中选择Preprocessor,然后,在Additional include directories编辑栏中加入头文件所在的目录,比如X:\oscar\esqlpc\include或者$(SZ_OSCAR_HOME)\esqlpc\include。

设置好应用程序开发环境后,用户就可以进行编译和链接工作了。VC集成环境提供了很好的可视化操作界面。用户可以参考VC集成开发环境的帮助文档,进行其它选项设置。每次用户修改.pc文件后,都需要显式调用esqlpc工具重新生成相应的.c文件。

注解

如果链接时某个库使用的是动态链接库,则在运行时,要求相应的动态链接库位于操作系统的搜索路径中,否则生成的可执行程序将会因为无法找到动态链接库而不能运行。关于搜索路径的信息,请参见《windows核心编程》或者VC集成开发环境帮助手册。

第二种方法,把预编译程序esqlpc完全集成到应用程序开发环境中去。

首先选择Project菜单的Add To Project子菜单的Files,打开Insert Files To Project窗口,在文件类型的下拉菜单中选择所有文件,选中需要预编译的.pc文件,如果有相应的.c文件,也一起选中,点击OK把这些文件加入工程。

选中需要进行预编译的.pc文件,选择Project菜单的Settings选项,打开Project Settings窗口(或者用右键点击需要进行预编译的.pc文件,然后在跳出的菜单中选择Settings选项),选择Custom Build选项卡,在Settings For中选择相应的工程和版本(Debug或者Release版本),在Commands的编辑框中加入esqlpc -I$(SZ_OSCAR_HOME)\esqlpc\include $(ProjDir)\$(TargetName).pc,在Output编辑框中加入$(ProjDir)\$(TargetName).c。该设置把当前工程所在的目录$(ProjDir)作为工作目录。

用户选择编译命令后,在编译工作进行前,它比较.pc文件对应的.c文件的修改时间是否比.pc文件更早,如果是,那么它用Commands中列出的命令把工作目录中和工程名同名并且扩展名为.pc的文件预编译成为同名的.c文件。然后它才进入正常的调用VC的编译工具cl进行编译的过程。

从用户的角度来看,这种方法和第一种方法的不同之处在于用户不需要显式地使用esqlpc工具来进行预编译,因为预编译过程已经集成到编译过程中去了。

接下来的工作和第一种方法设置esqlpc工具完成后完全一样。在此不再赘述,请参见第一种方法。

两种方法的比较:首先,第一种方法的设置对于所有工程都可见,第二种方法仅对当前设置的工程可见,甚至不同的版本(Debug版本或者Release版本)都是不可见的;其次,第一种方法每次修改.pc文件后要手工再次调用工具生成.c文件,而第二种方法VC集成开发环境自动比较时间,决定是否生成新的.c文件。

LINUX环境

第一步 预编译。

这一步的主要工作是把test.pc文件作为源文件,esql*C预编译程序esqlpc通过解析该文件,把C语言编写的语句原样输出到目标文件;而对于其中嵌入的ESQL语句,将其转换为对ESQL系统库提供的接口函数的调用,如果用户没有用-o选项设置目标文件的名字,那么生成的目标文件名为test.c。这一步执行下面的命令:

esqlpc test.pc

执行该命令时,如果出现找不到头文件的提示信息,则需要用-I参数指定所包含头文件的路径:

esqlpc -I$SZ_HOME_OSCAR\esqlpc\include test.pc

第二步 编译链接C程序。

这一步的工作就是把第一步生成的目标C文件用C语言编译工具进行编译,并且链接必要的库,生成可执行文件。

在LINUX操作系统下,可以通过以下两步操作生成可执行文件:

gcc -c -I$SZ_OSCAR_HOME/esqlpc/include -I$SZ_OSCAR_HOME/onet test.c

gcc test.o -L$SZ_OSCAR_HOME/bin -lesql -lonet -lpthread -o test

其中,-c选项表示只编译,不链接;test.c作为编译器gcc的源文件;-I指定头文件所在的目录;-L指定库文件所在的目录;具体的gcc编译选项设置请参照gcc编译器手册-o test指定可执行文件名为test;-lesql -lonet指定所需要库的名字的特殊部分,gcc的链接程序会在系统搜索路径下搜索名为libesql、libonet的库文件,并链接它们,缺省链接以.so为扩展名的库文件,也就是动态库,如果没有动态库,则链接静态库。

第一步,只编译test.c文件,缺省的输出为test.o目标文件,用户可以用-o指定输出的目标文件的名字。这一步不进行链接动作,不解析test.o本身未定义的外部符号。第二步进行链接工作,它把第一步生成的目标文件test.o和库libesql、libonet进行链接,这一步解析所有test.o目标文件未定义的所有外部符号,解析成功则生成可执行文件test,否则产生链接错误。当然,以上两步操作也可以合成一步实现:

gcc test.c -I$SZ_OSCAR_HOME/esqlpc/include -I$SZ_OSCAR_HOME/onet -L$SZ_OSCAR_HOME/bin -lesql -lonet -lpthread -o test

注解

关于gcc的详细信息,请参见gcc编译器使用手册,或者在linux命令窗口输入man gcc或者gcc --help。

注解

如果链接时使用的是动态链接库,则在运行时,要求esql和onet两个动态链接库位于操作系统的搜索路径中, 否则生成的可执行程序将会因为无法找到动态链接库而不能运行。

因为ESQL系统库和网络连接库ONET库都既有动态库,又有静态库,用户可以自由选择使用动态库还是静态库,所以,最终用户也可能有四种选择。要使用指定的库时,请在链接的时候把相应的库名加入命令中即可。

我们建议您都使用动态库或者都使用静态库。使用动态库的优势在于可执行文件目标代码所占空间小,但是必须在已经安装神通数据库的ESQL组件的系统上才能运行。使用静态库的优势在于,即使在没有安装神通数据库的ESQL组件的系统上也可以运行,但是它的可执行文件的目标代码所占空间比较大。