如果你已经成功安装 F r e e T D S 库文件,想了解在代码中如何使用的话,请查阅: \color{red}{如果你已经成功安装FreeTDS库文件,想了解在代码中如何使用的话,请查阅:} 如果你已经成功安装FreeTDS库文件,想了解在代码中如何使用的话,请查阅:《FreeTDS库文件在C++代码中的简单应用》 ,这里提供了一个简单的 D e m o 程序供参考 \color{red}{,这里提供了一个简单的Demo程序供参考} ,这里提供了一个简单的Demo程序供参考
在安装FreeTDS库文件之前,我查阅了好多的文章,讲述的都是 freetds-0.9x 的一些老版本的安装。而没有找到关于 freetds 最新版本的安装说明。我想大概是我搜索方式不对吧。无奈只能不断摸索,最终将从 GitHub 上下载的最新版本的 FreeTDS 源代码编译成功了。
写本文的当前时间为2023年2月15日,GitHub 上 freetds 的源码链接:https://github.com/FreeTDS/freetds。目前发布的最新的 Releases 版本是1.3.17。
新版本的源码和旧版本的源码最大的区别在于没有了现成的 configure 和 Makefile 文件,因此当我们下载了最新的 freetds 项目源码解压后,一下子就懵了。感觉查阅过的资料都是骗人的,说好的configure文件呢?我查阅的资料包括官网,都在说,运行 configure 文件生成 Makefile 文件,然后 make & make install 就安装成功了,多么简单啊。实际,对于菜鸟的我来说,configure 文件都没有,还谈什么编译和安装,只有懵逼相伴。
好了,扯了一堆,其实都是我自己的感受,我对于 Linux 也是仅限于用过几个命令的层次而已。我也只能默默的看官网的说明,过程很难受。好在最终成功编译了出来。
FreeTDS 官网的 User Guide 用户指南第2章:Build FreeTDS 中,介绍了
[4] Versions used for this release
* autoconf (GNU Autoconf) 2.69
* automake (GNU automake) 1.15
* ltmain.sh (GNU libtool) 2.4.6
即,要想编译源码,Linux 环境需要安装有 GNU 版本的 autoconf、automake、libtool 工具。所以第一步就是安装这些程序:
[root@localhost freetds]# yum install autoconf
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
>>>>>>>>>>>>>> 中间的安装过程省略 <<<<<<<<<<<<<<
Running transaction
正在安装 : m4-1.4.16-10.el7.x86_64 1/3
正在安装 : perl-Data-Dumper-2.145-3.el7.x86_64 2/3
正在安装 : autoconf-2.69-11.el7.noarch 3/3
验证中 : perl-Data-Dumper-2.145-3.el7.x86_64 1/3
验证中 : m4-1.4.16-10.el7.x86_64 2/3
验证中 : autoconf-2.69-11.el7.noarch 3/3
已安装:
autoconf.noarch 0:2.69-11.el7
作为依赖被安装:
m4.x86_64 0:1.4.16-10.el7 perl-Data-Dumper.x86_64 0:2.145-3.el7
完毕!
[root@localhost freetds]#
[root@localhost freetds]# yum install automake
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
>>>>>>>>>>>>>> 中间的安装过程省略 <<<<<<<<<<<<<<
Running transaction
正在安装 : perl-Test-Harness-3.28-3.el7.noarch 1/2
正在安装 : automake-1.13.4-3.el7.noarch 2/2
验证中 : perl-Test-Harness-3.28-3.el7.noarch 1/2
验证中 : automake-1.13.4-3.el7.noarch 2/2
已安装:
automake.noarch 0:1.13.4-3.el7
作为依赖被安装:
perl-Test-Harness.noarch 0:3.28-3.el7
完毕!
[root@localhost freetds]#
[root@localhost freetds]# yum install libtool
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
>>>>>>>>>>>>>> 中间的安装过程省略 <<<<<<<<<<<<<<
Running transaction
正在安装 : libtool-2.4.2-22.el7_3.x86_64 1/1
验证中 : libtool-2.4.2-22.el7_3.x86_64 1/1
已安装:
libtool.x86_64 0:2.4.2-22.el7_3
完毕!
[root@localhost freetds]#
用上面的安装的版本也是可以编译成功的,当然你也可以指定安装推荐的版本。
这里用 git 工具克隆项目源码到本地仓库。项目源码的 https 链接获取可以参考文章《CMake在BC-Linux服务器上源码编译和安装》,这里直接给出代码链接:https://github.com/FreeTDS/freetds.git 。
git 工具是 Linux 系统自带的工具,可以直接使用。如果没有安装,可以使用命令:yum install git 进行安装。
命令1:git init myfreetds # 创建一个本地git仓库,名字为myfreetds,当然名字可以自己起,效果就是在当前目录下生成一个 myfreetds 名字的文件夹,里面有构成仓库的组成文件,都是隐藏文件。
命令2:git clone https://github.com/FreeTDS/freetds.git # 意思是拉取GitHub上的源代码到本地。效果就是下载了freetds源代码到myfreetds文件夹中。
如下所示:
[root@localhost code]# git init myfreetds
初始化空的 Git 版本库于 /home/fenghx/code/downtest/myfreetds/.git/
[root@localhost code]# ls
myfreetds
[root@localhost code]# cd myfreetds/
[root@localhost myfreetds]# ls
[root@localhost myfreetds]# ls -al
总用量 0
drwxr-xr-x. 3 root root 18 2月 15 16:13 .
drwxr-xr-x. 3 root root 23 2月 15 16:13 ..
drwxr-xr-x. 7 root root 119 2月 15 16:13 .git
[root@localhost myfreetds]# git clone https://github.com/FreeTDS/freetds.git
正克隆到 'freetds'...
remote: Enumerating objects: 58058, done.
remote: Counting objects: 100% (1286/1286), done.
remote: Compressing objects: 100% (501/501), done.
remote: Total 58058 (delta 927), reused 1098 (delta 785), pack-reused 56772
接收对象中: 100% (58058/58058), 14.51 MiB | 33.00 KiB/s, done.
处理 delta 中: 100% (48275/48275), done.
[root@localhost myfreetds]# ls
freetds
[root@localhost myfreetds]# cd freetds/
[root@localhost freetds]# ls
AUTHORS.md ChangeLog config.rpath COPYING_LIB.txt doc freetds.spec.in INSTALL.GIT.md interfaces m4 misc NEWS.md PWD.in README.Windows src Thanks-0.95 TODO.freddy vms
autogen.sh CMakeLists.txt configure.ac COPYING.txt freetds.conf include INSTALL.md locales.conf Makefile.am mkinstalldirs phptests README.md samples tds.dox Thanks-1.0 TODO.md win32
[root@localhost freetds]#
现在源码就下载好了,代码下载还是有点耗时的,请耐心等待。如果出现下载失败的情况,重新下载就可以了。
由于没有 configure 文件,所以我们无法进行构建项目,此时需要先运行 autogen.sh 文件来生成 configure 和 Makefile 文件。用 vim 工具打开 autogen.sh 文件可以看到如下信息:
#!/bin/sh
# Run this to generate all the initial makefiles, etc.
# $Id: autogen.sh,v 1.10 2011-03-22 17:54:04 jklowden Exp $
# From automake.info:
#
# Many packages come with a script called `bootstrap.sh' or
# `autogen.sh', that will just call `aclocal', `libtoolize', `gettextize'
# or `autopoint', `autoconf', `autoheader', and `automake' in the right
# order. Actually this is precisely what `autoreconf' can do for you.
# If your package has such a `bootstrap.sh' or `autogen.sh' script,
# consider using `autoreconf'. That should simplify its logic a lot
# (less things to maintain, yum!), it's even likely you will not need the
# script anymore, and more to the point you will not call `aclocal'
# directly anymore.
>>>>>>>>>>>>>> 部分文件内容省略 <<<<<<<<<<<<<<
文中第一句 “Run this to generate all the initial makefiles, etc.” 意思是:运行该文件以生成所有初始 makefile 等。文章接下来的 “From automake.info” 中大概的意思是,许多软件包都附带一个名为 bootstrap.sh 或 autogen.sh 的脚本,他们会按正确的顺序调用 aclocal、libtoolize、gettextize 或 autopoint、autoconf、autoheader 和 automake。这大大简化程序编译和配置的操作。
在运行 autogen.sh 脚本文件的时候,会出现一个报错:
configure.ac:123: warning: macro ‘AM_ICONV’ not found in library,
这个错误和文中提到的 gettextize 工具有关,因此我们需要先安装工具 gettext 程序。
安装命令: yum -y install gettext gettext-devel
安装到后面还有一个报错:
configure: error: required program ‘gperf’ not found.
所以我们还需要安装 gperf 软件包。
安装命令:yum -y install gperf
以上这两个软件包如果 yum 自己的软件仓库中没有的话,可以从 EPEL 扩展包中安装。EPEL 扩展包的安装详见:《Linux上安装EPEL扩展包》。
如果你在安装过程中没有出现这些错误,可以直接跳过,看后面的内容。
[root@localhost freetds]# ./autogen.sh
running /usr/bin/autoreconf in /home/fenghx/code/myfreetds/freetds:
......
>>>>>>>>>>>>>> 中间的构建过程省略 <<<<<<<<<<<<<<
......
Running
./configure
...
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
......
>>>>>>>>>>>>>> 中间的构建过程省略 <<<<<<<<<<<<<<
......
configure: debug enabled
checking CFLAGS for gcc -Wdeclaration-after-statement... -Wdeclaration-after-statement
done
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating include/freetds/version.h
config.status: creating include/tds_sysdep_public.h
config.status: creating include/freetds/sysdep_types.h
config.status: creating Makefile
config.status: creating include/Makefile
......
>>>>>>>>>>>>>> 中间的构建过程省略 <<<<<<<<<<<<<<
......
config.status: executing depfiles commands
config.status: executing libtool commands
Now type `make' to compile FreeTDS.
[root@localhost freetds]#
如果出现上面最后一行:Now type `make’ to compile FreeTDS.,恭喜你,你已经成功生成了 configure 文件和 Makefile 文件。如下:
[root@localhost freetds]# ls
aclocal.m4 autom4te.cache compile config.rpath configure COPYING.txt freetds.conf include install-sh locales.conf Makefile misc NEWS.md README.md src Thanks-0.95 TODO.md
AUTHORS.md ChangeLog config.guess config.status configure.ac depcomp freetds.spec INSTALL.GIT.md interfaces ltmain.sh Makefile.am missing phptests README.Windows tds.dox Thanks-1.0 vms
autogen.sh CMakeLists.txt config.log config.sub COPYING_LIB.txt doc freetds.spec.in INSTALL.md libtool m4 Makefile.in mkinstalldirs PWD.in samples test-driver TODO.freddy win32
[root@localhost freetds]#
此时生成的 Makefile 文件为默认的,初始的配置文件。因此我们还需要使用 configure 来配置我们自定义的 Makfile 文件。
根据官网的介绍,configure 命令参数有很多,这里提三个:
查看 FreeTDS 支持哪些版本的指定,如下:
[root@localhost freetds]# ./configure --help
`configure' configures FreeTDS 1.4.dev.20230215 to adapt to many kinds of systems.
Usage: ./configure [OPTION]... [VAR=VALUE]...
......
>>>>>>>>>>>>>> 中间的内容省略 <<<<<<<<<<<<<<
......
--with-tdsver=VERSION TDS protocol version (5.0/7.1/7.2/7.3/7.4/auto)
[auto]
......
>>>>>>>>>>>>>> 中间的内容省略 <<<<<<<<<<<<<<
......
Report bugs to the package provider.
[root@localhost freetds]#
可以看到当前可以指定的版本为 5.0/7.1/7.2/7.3/7.4,最高为 7.4 版本。由于我的数据库安装的是 SQL Server2017 所以需要指定最高版本。
下面使用 configure 配置 Makefile 文件,这里我指定安装路径为默认路径,版本指定7.4,允许使用微软数据库函数库。
命令:./configure --prefix=/usr/local --with-tdsver=7.4 --enable-msdblib
[root@localhost freetds]# ./configure --prefix=/usr/local --with-tdsver=7.4 --enable-msdblib
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
......
>>>>>>>>>>>>>> 中间的内容省略 <<<<<<<<<<<<<<
......
configure: debug enabled
checking CFLAGS for gcc -Wdeclaration-after-statement... -Wdeclaration-after-statement
done
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating include/freetds/version.h
config.status: creating include/tds_sysdep_public.h
config.status: creating include/freetds/sysdep_types.h
config.status: creating Makefile
config.status: creating include/Makefile
......
>>>>>>>>>>>>>> 中间的内容省略 <<<<<<<<<<<<<<
......
config.status: executing libtool commands
[root@localhost freetds]#
到这里,新的自定义的 Makefile 就生成了。
直接运行: make 命令进行编译,然后运行 make install 命令进行安装即可,这里不在累赘。
需要说明的是:如果你不是通过 git 命令拉取的代码,而是直接下载的 .tar.gz 压缩包,那么在 make 和 make install 的时候会报一个查看历史提交记录失败的错误。如下
git log -1 '–pretty=format:<!-- Autogenerated -->%n<!ENTITY ug.dat…省略…
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
这些错误一般都出现在最后,此时所有的库都编译或是安装完成了,git 需要查看提交的历史记录,但是你并没有本地仓库,也就没有提交的历史记录,所以失败了(我的理解)。这个错误不影响 freetds 的编译和安装,已经亲自测试了。
安装完成后会在 /usr/local/include 目录下生成头文件,其中就有开发项目时代码调用需要的 sybfront.h 和 sybdb.h 头文件,以及编译时需要链接的库文件 sybdb。
[root@localhost freetds]# ls /usr/local/lib
libct.a libct.la libct.so libct.so.4 libct.so.4.0.0 libsybdb.a libsybdb.la libsybdb.so libsybdb.so.5 libsybdb.so.5.1.0
[root@localhost freetds]# ls /usr/local/include/
bkpublic.h cspublic.h cstypes.h ctpublic.h odbcss.h sqldb.h sqlfront.h sybdb.h syberror.h sybfront.h tds_sysdep_public.h
[root@localhost freetds]#
到这里开发软件所需的 FreeTDS 库文件就安装完成了。
如果你已经成功安装 F r e e T D S 库文件,想了解在代码中如何使用的话,请查阅: \color{red}{如果你已经成功安装FreeTDS库文件,想了解在代码中如何使用的话,请查阅:} 如果你已经成功安装FreeTDS库文件,想了解在代码中如何使用的话,请查阅:《FreeTDS库文件在C++代码中的简单应用》 ,这里提供了一个简单的 D e m o 程序供参考 \color{red}{,这里提供了一个简单的Demo程序供参考} ,这里提供了一个简单的Demo程序供参考