FreeTDS库文件之在BC-Linux服务器上的编译安装

\color{red}{如果你已经成功安装FreeTDS库文件,想了解在代码中如何使用的话,请查阅:}
《FreeTDS库文件之C++代码中的简单应用》\color{red}{,这里提供了一个简单的C++Demo程序供参考}
  在安装FreeTDS库文件之前,我查阅了好多的文章,讲述的都是freetds-0.9x的一些老版本的安装。而没有找到关于freetds最新版本的安装说明的。我想大概是我搜索方式不对吧。无奈只能不断摸索,最终将GitHub上下载的最新版本的FreeTDS源代码编译成功了。
  写本文的当前时间为2023年2月15日,GitHub上freetds的源码链接:https://github.com/FreeTDS/freetds。目前发布的最新的Releases版本是1.3.17。
  新版本的源码和旧版本的源码最大的区别在于没有了现成的configureMakefile文件,因此当我们下载了最新的freetds项目源码解压后,一下子就懵了。感觉查阅过的资料都是骗人的,说好的configure文件呢?我们查阅的资料包括官网,都在说,运行configure文件生成Makefile文件,然后make & make install 就安装成功了,多么简单啊。实际,对小白的我来说,configure文件都没有,还谈什么编译和安装,只有懵逼相伴。
  好了,扯了一堆,其实都是我自己的感受,我对于Linux也是仅限于用过几个命令的层次而已。对于小白的我在这种情况下也只能默默的看官网的说明,用百度翻译一句一句的翻译,过程相当难受。好在最终成功编译了出来。

  • 编译FreeTDS项目源码需要的环境

FreeTDS官网的User Guide用户指南第2章:Build FreeTDS(http://www.freetds.org/userguide/build.html) 中,介绍了

[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]# autoconf --version
autoconf (GNU Autoconf) 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+/Autoconf: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>, <http://gnu.org/licenses/exceptions.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by David J. MacKenzie and Akim Demaille.
[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]# automake --version
automake (GNU automake) 1.13.4
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl-2.0.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Tom Tromey <tromey@redhat.com>
       and Alexandre Duret-Lutz <adl@gnu.org>.
[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]# libtool --version
libtool (GNU libtool) 2.4.2
Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996

Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[root@localhost freetds]# 

用上面的安装的版本也是可以编译成功的,当然你也可以指定安装推荐的版本。

  • 下载FreeTDS项目源码

这里用git工具克隆项目源码到本地仓库。首先登陆GitHub,在搜索框中键入freetds,点击搜索就可以找到FreeTDS项目,打开仓库FreeTDS/freetds(https://github.com/FreeTDS/freetds),点击绿色code按钮,选择HTTPS页,可以得到代码链接:https://github.com/FreeTDS/freetds.git

  1. 用git命令克隆项目源码到本地路径

git工具是Linux系统自带的工具,可以直接使用。
命令:git init myfreetds : 创建一个本地git仓库,名字为myfreetds,当然名字可以自己起,效果就是在当前目录下生成一个myfreetds名字的文件夹,里面有构成仓库的组成文件,都是隐藏文件。
命令: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]# 

现在源码就下载好了,代码下载还是有点耗时的,请耐心等待。如果出现下载失败的情况,重新下载就可以了。

  1. 编译源代码并安装

由于没有configureMakefile文件,所以我们无法进行编译,于是想configure文件应该是由其它的执行文件生成的,但是不知道应该执行哪个文件。这些就要说些经验了,我发现里面有一个autogen.sh文件,我之前做嵌入式的时候,也是在Linux环境下编译代码的,生成的可执行文件就是以.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.

srcdir=`dirname $0`
PKG_NAME="FreeTDS."

# If autoreconf encounters an error, it might be because this is the 
# very first time it was run, meaning that some files e.g. config.sub
# are missing.  We retry with --install (and perhaps we should 
# try --force, too).  
#
# Revision 1.6 was the last one not to use autoreconf.  If you can't get
# this (simpler) one to work, you might try that one. 

(       cd $srcdir
        echo running `which autoreconf` in `pwd`: 
        autoreconf || autoreconf --install
) || exit

#conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c

if test x$NOCONFIGURE = x; then
  echo Running $srcdir/configure $conf_flags "$@" '...' \
        | tr ' ' \\n \
        | sed  's/^-/   &/'
  $srcdir/configure $conf_flags "$@" \
  && echo Now type \`make\' to compile $PKG_NAME
else
  echo Skipping configure process.
fi



"autogen.sh" 44L, 1576C                                                                                  1,1          全部

文中第一句 “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 & Makefile
  • 然后通过 configure 配置自定义的 Makefile 文件
  • 最后 make & make install

我在运行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

如果你在安装过程中没有出现这些错误,可以直接跳过,看后面的内容。
下面让我们运行 autogen.sh 脚本

[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]# ^C
[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命令参数有很多,这里提三个:

  • --prefix=PREFIX :设置FreeTDS库文件安装的目录,默认为:/usr/local,命令行中将PREFIX替换为自定义的路径。
  • --with-tdsver=VER :指定FreeTDS的安装版本,默认为:auto,命令行中将VER替换为指定的版本号。这里的版本主要是根据不通的数据库版本来选择的,具体什么版本的freetds支持什么数据库可以查阅官网《用户指南》中第一章中 History of TDS Versions章节 (http://www.freetds.org/userguide/tdshistory.html)。具体支持配置的版本有哪些,可以通过执行./configure --help命令来查看。下面会说怎么看。
  • --enable-msdblib :这个选项按官网的解释不太好理解,其它资料解释为:允许Microsoft数据库函数库。

查看 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命令拉取的代码,而是直接下载的 .zip 或 .tar.gz 压缩包,那么在make和make install的时候会报一个查看历史提交记录失败的错误。如下
git log -1 '--pretty=format:%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 库文件就安装完成了。感谢您的查阅。

\color{red}{如果你已经成功安装FreeTDS库文件,想了解在代码中如何使用的话,请查阅:}
《FreeTDS库文件之C++代码中的简单应用》\color{red}{,这里提供了一个简单的C++Demo程序供参考}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容