- 论坛徽章:
- 1
|
linux编程FAQ(1)
- 1.1) 我需要对o src/Makefile.global 或
- src/Makefile.custom 文件做什么修改以及我还需要做其他修改吗?
- 运行 src 目录里面的客户化脚本是修改 makefile 的最简单方法,
- 它会为你生成一个 Makefile.custom 。
- 你可能需要做的其他修改是替换 2.5.3 Flex,
- 因为这个版本有臭虫,通常表现为 createuser 失败(参阅问题 3.4)
- 如果你手工修改 makefiles,你*必须*设置下面的变量
- PORTNAME= linux
- 你还需要把下面的变量改变为你自己的安装:
- POSTGRESDIR
- 如果你打开了 USE_TCL 选项,你将需要设置下面的内容:
- TCL_INCDIR=
- TCL_LIBDIR=
- TCL_LIB=
- TK_INCDIR=
- TK_LIBDIR=
- TK_LIB=
- X11_INCDIR=
- X11_LIBDIR=
- X11_LIB=
- 在我的 Slackware3.0 系统上,这些是:
- TCL_INCDIR= /usr/include/tcl
- TCL_LIBDIR= /usr/lib
- TCL_LIB= -ltcl
- TK_INCDIR= /usr/include/tcl
- TK_LIBDIR= /usr/lib
- TK_LIB= -ltk
- X11_INCDIR= /usr/include/X11
- X11_LIBDIR= /usr/X386/lib
- X11_LIB= -lX11
-
- 你可能还要按照 INSTALL 文件和 Makefile.global 文档里描述的那样做其他修改。
- 1.2) 为什么我在缺少 libreadline 时会有麻烦?
- Linux 系统通常不自带 GNU readline 库。
- 要么确信自己没有在 src/Makefile.global 或 src/Makefile.custom 里激活 readline 选项
- 要么把 GNU readline 库装上。
- 请注意t Debian Linux (象 FreeBSD 一样)的确自带 readline。
- 1.3) [REDHAT] 为什么我缺少 libdl 和 dlfcn.h 时会有麻烦?
- 这表明它在编译的最后阶段不能链接到象 dlopen(),dlclose() 等函数上
- libdl 库是用于在运行时动态链接用户支持函数的。
- 由于某种原因,这个库在 Redhat 的发布中漏了。
- 好象最新的 Redhat 4.0 版本(Colgate,译注:太老了,现在估计大家都没事了。)已经打了补丁。
- RedHat 在他们的 FTP 站上有一个新的 ld.so RPM 包。
- 只需要抓取:
- ftp://ftp.redhat.com/pub/redhat/devel/i386/RedHat/RPMS/ld.so-1.7.14-4.i386.rpm
- 用通常的方法安装这个 RPM 文件,你就能用了!
- 注意!你在安装完这个库以后,在编译前不用重新运行 configure 和进行 make clean
- 有一次报告说在升级这个库的时候,因为有程序访问这个库而导致系统崩溃
- (一点也不让人奇怪)。因此,在安装新库之前重起系统,并且尽可能少运行程序
- 是个好主意。进入单用户模式可能是最好的方法。
- 如果你想用难一点的方法做这些事情,你可以从下面站点获取库和头文件:
-
- ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ld.so-1.7.14.tar.gz
- 另外,你可以在下面位置找到预编译的二进制
- distributions/debian/buzz/binary-i386/base/ld.so-1.7.14-4.deb
- 在同一个站点,或者按照问题 1.2 给出的指示可以修正 Slackware 3.1 的早期版本
- 的同样错误。除非你知道自己在干什么,否则不要用这个方法!
- 1.4) [SLACKWARE 3.1] 为什么我缺少 libdl 和 dlfcn.h 时会有麻烦?
- 这表明它在编译的最后阶段不能链接到象 dlopen(),dlclose() 等函数上
- 参阅问题 1.3 的回答。Slackware 一直到版本 3.0 都提供了这个库和相应头文件
- 并且看起来在最新的版本 3.1 里面好象也有这个库了,但是 3.1 的早期版本(早于
- 1996年9月9日)里面缺少这个库而且许多 CD-ROM 版本是用第一个 3.1 版本印制的。
- 有一次报告说在升级这个库的时候,因为有程序访问这个库而导致系统崩溃
- (一点也不让人奇怪)。因此,在安装新库之前重起系统,并且尽可能少运行程序
- 是个好主意。进入单用户模式可能是最好的方法。
- 最简单的修补是从最近的 Slackware 版本的 a4 磁盘获取文件 ldso.tgz
- 然后在根(/)目录解包这个文件,再
- sh install/doinst.sh
- 要完成安装。在这个后面做一次
- ldconfig
- 注意!在完成库的安装和重新编译之前,你需要重新运行 configure 和做一次 make clean。
- 如果你想手工安装,你首先必须安装文件
- dlfcn.h 到 /usr/include 目录。
- 第二,把文件 libdl.so.1.7.14 (或者任何最新的版本)
- 安装到 /lib,然后做:
- cd /lib
- ln -sf libdl.so.1.7.14 libdl.so.1
- ln -sf libdl.so.1 libdl.so
- 在某些系统上(取决于你的 GCC 的配置),可能还有必要做:
- cd /usr/lib
- ln -sf /lib/libdl.so .
- 最后
- ldconfig
- 注意!在完成库的安装和重新编译之前,你需要重新运行 configure 和做一次 make clean。
- 1.5) M我编译后端时退出了,并且报错说缺少头文件 dlfcn.h
- 参阅问题 1.3/1.4 的回答。如果你使用 a.out 的系统,别忘了你必需首先安装
- dld 包(这个包在大多数 a.out 系统上都没有提供),以获取 dlfcn.h。参阅问题 1.11。
- 1.6) GCC 抱怨说选项 -fpic 被忽略
- 早期的 GCC 可以接受 -fpic 或 -fPIC。
- 现在的版本的 GCC (V2.7.2?)要求使用 -fPIC。
- 如果你正在使用一个 ELF 版本的 Linux,你可以放心的忽略这个选项,因为 -fPIC 是却省的。
- 你可以通过编辑 src/Makefile.global 和修改 CFLAGS_SL 来修正这些。
- 1.7) 我收到下面形式的警告
- warning: cast from pointer to integer of different size
- 这些在早期的 Postgres95 版本中出现并且可以安全的忽略
- PostgreSQL V6.0 应该编译时不带警告,除了那些与系统头文件有关的(
- 也可以安全的忽略)。
- 1.8) [SuSE-Linux 4.2-4.4] curses 和 termcap 在那里?
- SuSE-Linux 4.2 有 ncurses 但没有 curses。4.4 好象两个都有。
- SuSE-Linux 的 termcap 库在 /usr/lib/termcap
- 而不是在 /usr/lib。
- PostgreSQL (up to V6.0)
- -----------------------
- 把 src/Makefile.custom 里面的 CURSES_LIB 的值设置为 -lncurses
- (或者客户化脚本来做这些事情)。
- 向 src/Makefile.custom 文件里面加下面的行:
- LDADD_BE+= -L/usr/lib/termcap
- 你可能要编辑 src/bin/psql/Makefile 然后修改:
- ifeq ($(PORTNAME), linux)
- LD_ADD+=
- 为:
- ifeq ($(PORTNAME), linux)
- LD_ADD+= -ltermcap
- PostgreSQL (V6.1)
- -----------------
- configure 脚本不会到 /usr/lib/termcap 里面查找
- termcap 库,因此,当向你询问附加的搜索路径时,你应该把这个路径声明为
- 其中之一。
- 如果这些不生效(我手头没有 SuSE 以检验这样的处理是否正确)
- 那么在运行完 configure 后,你需要编辑
- src/Makefile.global 并向 LDFLAGS 行增加 -ltermcap(在 -lreadline 之后)。(另外,你也可以
- 在运行 configure 之前修改 src/Makefile.custom。)
- 有些 SuSE 版本只提供 ncurses,因此你可能需要强制使用
- ncurses 而不是 curses —— 通过把
- -lcurses 改为 -lncurses。(据报告对 SuSE 5.1 有效)
- 1.9) 为什么我的 ld.so 有问题?
- 如果你碰到 ld.so 的毛病,在 ELF 里面需要另外一个库来动态链接,
- 那么你已经把你的安装和(很有可能是)Linux 的升级搞混了。
- 参阅问题 1.3/1.4 的回答。你可能需要安装 ld.so.x.y.z 到 /lib 然后运行 ldconfig。
- 最近的稳定的 ld 包的版本是 1.7.14。
- 在我写作的时候,版本 1.8.x 的 ld 正处在试验阶段。
- 1.10) 为什么我收到 `yy_flush_buffer undefined' 错误?
- 这个毛病不是 Linux 特有的,但是在老的 Linux 安装里比较常见。
- 你必须拥有最近版本的 flex (2.5.2 或更新)来编译
- PostgreSQL。请注意 flex 2.5.3 有一个臭虫:参阅问题 3.4。
- 1.11) 我怎样在一个 a.out 系统上编译 PostgreSQL ?
- 首先,你必须先安装 dld 库。这些可以在
- Sunsite 获取:
- Linux/libs/dld.3.2.7.tar.gz
- (ftp://sunsite.unc.edu/pub/Linux/libs/dld.3.2.7.tar.gz)
- 其次,向你的 src/Makefile.custom 里增加下面一行:
- LINUX_ELF=
- (或者使用客户化脚本)
- 1.12) 为什么制作带着下面信息退出:
- yacc -d /disk2/PostgreSQL/src/backend/parser/gram.y
- make: /usr/bin/make: cannot execute binary file
- 这些是早期版本的 Postgres95 的毛病。缺省时
- PostgreSQL 是使用 bison -y 而不是 yacc。
- yacc 通常是通过一个调用 bison -y 的脚本实现的。
- 由于某种原因(某个版本的 make? 某个版本的 bash?),make 不能执行这个脚本文件。
- 要修补这些,只需要编辑 src/mk/port/postgres.mk.linux
- 以及,在该文件的末尾,修改:
- # YACC = bison -y
- 为
- YACC = bison -y
- 1.13) 在 src/Makefile.global 里 X11_LIB 对 libsocket 和 libnsl 的引用在那里?
- 这是一个 1.08 里的毛病(那是与 Sun Solaris 相关的)。
- 在 1.09 和 6.0 里修补好了。
- 1.14) [DEBIAN] libtermcap 在那里?
- Debian Linux 是不带 termcap 库的,而且使用 ncurses
- (它用 terminfo 代替 termcap)。我们不需要修改
- src/bin/psql/Makefile 里面的 CURSES_LIB 变量,因为 Debian 提供了一个
- 从 libncurses 到 libcurses 的链接(不象 SuSE-Linux --- 参阅问题 1.8)。
- 你可能需要编辑 src/bin/psql/Makefile 并把下面的行:
- ifeq ($(PORTNAME), linux)
- LD_ADD+= -ltermcap
- 改成:
- ifeq ($(PORTNAME), linux)
- LD_ADD+=
- 1.15) [REDHAT] 我能把 PostgreSQL 做成 RPM 吗?
- 当然啦!Michal Mosiewicz (http://www.pdi.lodz.pl/~mimo)已经为大家把
- PostgreSQL V6.0 的 Intel 体系的软件包做成了一个 RPM 上载到了
- ftp://ftp.redhat.org/pub/Incoming/Postgres-6.0-1.i386.rpm
- 这是一个预编译的版本,源文件 RPM 在我写作(1997年二月3日)还在制作。
- 1.16) 当我试图在 Linux 下编译一个开发版本时,编译带着类似下面的信息退出了:
- In file included from /usr/include/sys/sem.h:8,
- from ipc.c:37:
- /usr/include/asm/bitops.h:32: warning: no previous prototype for Set_bit'
- ....
- make: *** [ipc.o] Error 1
- The problem is that Linux provides no prototypes for these
- inline functions. The solution is to go into the
- .../src/backend/storage/ipc directory and edit the Makefile.
- Change the line
- CFLAGS+=$(INCLUDE_OPT)
- to
- CFLAGS+=$(INCLUDE_OPT) -Wno-error
- Do the same in the ../src/backend/storage/lmgr directory.
- 1.17) 当编译 postgres 时,gcc 报告信号 11 并退出。
- More specifically:
- gcc: Internal compiler error: program cc1 got fatal
- signal 11
- 这可能是硬件/内存问题。PortgreSQL 是一个大程序,而大的
- gcc 编译(类似制作 PostgreSQL 或编译内核)象其他几个程序一样
- 对内存施加了较高的负荷,导致在平常操作中不出现的错误。轻负荷的
- 操作系统不会对硬件有这样高的压力,因此你可能永远不会在 DOS/Window上看到这个毛病。
- 关于这个问题的更多信息在:
- http://www.bitwizard.nl/sig11
- 通过这个 Sig11 FAQ,好象运行在 Cyrix 处理器上的
- Redhat 5.0 gcc 有特别的问题。参阅上面的 URL 获取更多细节!
- 1.18) 我能否在 MkLinux 里安装 6.1.1?
- Tatsuo Ishii 在 MkLinux DR2.1 升级2 里成功完成了这个工作,做了一个小补丁:
- ftp://ftp.sra.co.jp/pub/cmd/postgres/6.1.1/mklinux.patch.gz
- 1.19) 为什么制作退出或崩溃?
- 有一些人报告说 gmake 要么是提前推出,要么是段错误(seg faulting)。后者被
- 发现在 gmake 3.74 上出现 - 升级到 3.76.1 可以解决这个问题。不过,
- 3.74 被认为在其他人的安装中工作得很好。简而言之,在报告这个问题之前先
- 把 gmake 升级到你能找到的最新版本。
- 1.20) 我如何为 486 或 pentium 处理器做优化?
- 缺省的编译选项不会对 486 或 Pentium 处理器做任何优化。要增加这样的优化,
- 编辑 Makefile.custom,并且增加一行:
- CFLAGS+= -m486
- 或(对于大多数人还没有开始使用的新的编译器)
- CFLAGS+= -mpentium
- 或
- CFLAGS+= -mpentiumpro
- 1.21) 为什么我打印时间时会得到奇怪的结果(例如在蜕变测试 'timespan' 时)?
- 时间显示为:'4 hours 59 mins 60.00 secs'
- 而不是 '5 hours'
- 这是 Redhat 5.0 附带的 glibc2 库的问题。
- 对于 v5.0/hurricane 把你的 glibc 升级为最新 RedHat 版本。
- 任何早于 glibc-2.0.7 的库都可能有这个错误。
-
- 1.22) 为什么我编译 6.3.2 时为什么我没有生成任何 libqp 的共享库?
- v6.3.2 的 Linux 配置有一些最后阶段的破损。
- 参阅 ftp://postgresql.org/pub/patches/ 获取几个补丁,
- 包括一个 linux_elf 补丁。
- 1.23) 为什么编译失败,并且说 F_BOOLIN,F_BOOLOUT 和 F_BYTEAIN 未定义?
- 实际的信息象下面的东西:
- -I/usr/include/readline -O2 -Wall -Wmissing-prototypes -I..
- -Wno-error -c bootstrap.c -o bootstrap.o
- bootstrap.c:160: `F_BOOLIN' undeclared here (not in a function)
- bootstrap.c:160: initializer element for `Procid[0].inproc' is not
- constant
- bootstrap.c:160: `F_BOOLOUT' undeclared here (not in a function)
- bootstrap.c:160: initializer element for `Procid[0].outproc' is not
- constant
- bootstrap.c:161: `F_BYTEAIN' undeclared here (not in a function)
- bootstrap.c:161: initializer element for `Procid[1].inproc' is not
- constant
- 这是一个陷阱,除非你知道为什么会发生这些事情,因为这些常量好象在任何地方都
- 没有定义。
- 解决方法是在你开始制作前确保 cpp 包含在你的路径里。
- 在 Redhat 5.1,cpp 在 /usr/lib/gcc-lib/i386-redhat-linux/2.7.2.3
- ----------------------------------------------------------------------
- 第一节: 编译附加的程序
- ----------------------------------------------------------------------
- 2.1) 在编译 pgtclsh 时,链接器没有找到 libX11
- 向 src/Makefile.custom 增加下面一行
- X11_LIBDIR = /usr/X11R6/lib
- ----------------------------------------------------------------------
- 第二节: 运行时问题
- ----------------------------------------------------------------------
- 3.1) 在运行象 createuser 这样的脚本时,我收到一个错误,说 _fUnKy_POSTPORT_sTuFf_ 未定义
- 在 Postgres V1.06-V1.07 里面有一个臭虫,在 V1.08 及以上版本被修补了。
- 3.2) 我运行 postmaster 然后系统告诉我 'Bad system call(Core dumped)'(系统调用错误(内核倾倒))
- 着表明你没有在你的内核里面编译进共享内存支持。你需要重新编译 Linux 内核并增加这个特性。
- 3.3) 当我试图启动 Postmaster,为何我会收到下面形式的错误信息
- Failed Assertion("!(file != 0):(null)", File:
- "/usr/local/PostgreSQL/src/backend/storage/file/fd.c", Line: 257)
- !(file != 0) (0)
- initdb: could not create template database
- initdb: cleaning up.
- 你对文件 /dev/null 的权限不够。
- ls -l /dev/null 应该显示类似下面的东西:
- crw-rw-rw- 1 root wheel 2, 2 Oct 8 18:41 /dev/null
- 用下面的命令修正权限:
- chmod a+rw /dev/null
- 3.4) 为什么 createuser 不管用?
- 版本 2.5.3 的 GNU flex 和 createuser 有问题。
- 你可以把 flex 的版本降为 V2.5.2,升为 V2.5.4,
- 或者对 V2.5.3 应用在 doc/README.flex 里面写出的补丁。
- 你可以从下面站点获取 V2.5.4
- ftp://prep.ai.mit.edu/pub/gnu/flex-2.5.4.tar.gz
- 3.5) 为什么我会收到下面这样的信息:
- IpcMemoryCreate: memKey=155356396 , size=760632 ,
- permission=384IpcMemoryCreate: shmget(..., create, ...)
- failed: Invalid argument
- 你的 Linux 内核没有 IPC 支持。你必须重新编译内核
- 并打开这个选项。
- 3.6) 为什么 psql 带着下面的错误信息失效了:
- psql: can't load library 'libpq.so.1'
- Psql 被编译成动态地与 libpq 库进行联接。
- 要解决这个问题,你应该以 root 身份登陆并且编辑文件
- /etc/ld.so.conf
- 在该文件最后增加一行,给出 PostgreSQL 库目录的名称
- (你的 PostgreSQL 安装的 lib 子目录的名称)然后运行
- /sbin/ldconfig -v
- 另外,(也是在你没有 root 权限的情况下),你可以使用
- LD_LIBRARY_PATH 环境变量。
- LD_LIBRARY_PATH 变量包含一个冒号分隔的共享库搜索路径列表。
- 这个列表在 ldconfig 声明的库(路径)之前首先被搜索。
- 因此在 Bash 里,你将做类似下面的设置:
- export LD_LIBRARY_PATH='PathToPGSQL'/lib
- 或者,如果你使用 tcsh
- setenv LD_LIBRARY_PATH 'PathToPGSQL'/lib
- 把 'PathToPGSQL' 你的 PostgreSQL 的正确的顶级路径
- 请注意,你可以对一个动态链接的可执行文件使用 ldd 列出该可执行文件
- 所依赖的所有共享库
- 3.7) 其他奇怪的表现
- 我不知道如果没有一样东西工作正常是什么症状,不过有人曾指出我们要
- 注意让动态装载器装载正确版本的 libpq 库。如果你在库路径里面存在旧版本的库
- (例如在 /usr/lib),那么有可能装载这些旧库,而不是你想装载的新库。确保
- 你已经把它们删除了并且参照问题 Q3.6 获取关于装载库的详细信息。
- 3.8) 当 PostgreSQL 运行时宕掉系统,重起时 Linux 总是对磁盘进行 fsck。
- 有一些人报告说出现这个现象,并且看起来这是因为人们按照 INSTALL
- 文档建议的那样通过 /etc/inittab 运行 PostgreSQL 的原因。
- 因此我们建议你通过一个 rc 脚本来运行 postmaster。在一个类似 Slackware 的版本里,
- 你要修改 /etc/rc.d/rc.local 以启动 postmaster。在一个类似 RedHat 的版本里,
- 你要在 /etc/rc.d/rc3.d 里以 /etc/rc.d/init.d 骨架文件为基础创建一个 SysV 风格
- 的脚本。
- 有一个在 contrib/linux/postgres.init 里的例子脚本
- 下面是另外一个 John Robinson 提供的另外一个例子文件,
- 你要根据需要做一定的修改:
- #!/bin/sh
- #
- # postgreSQL.init This shell script takes care of starting and stopping
- # the PostgreSQL postmaster.
- #
- # Source function library.
- . /etc/rc.d/init.d/functions
- # Source networking configuration.
- . /etc/sysconfig/network
- # Check that networking is up.
- [ ${NETWORKING} = "no" ] && exit 0
- # See how we were called.
- case "$1" in
- start)
- # Start daemons.
- echo -n "Starting postgres Postmaster daemon:"
- if [ -z "`pidofproc postmaster`" ]
- then
- su postgres -c "/usr/local/pgsql/bin/postmaster -D /home/postgreSQL/data -p 5432 &"
- echo -n " postmaster"
- else
- echo -n " (already running)"
- fi
- echo
- touch /var/lock/subsys/postgres
- ;;
- stop)
- # Stop daemons.
- echo -n "Shutting down postgres Postmaster daemon: "
- killall -TERM postmaster 2>;/dev/null
- killall -TERM postgres 2>;/dev/null
- echo
- rm -f /var/lock/subsys/postgres
- ;;
- *)
- echo "Usage: postgres {start|stop}"
- exit 1
- esac
- exit 0
- 3.9) 为什么蜕变测试中 Query 32 用了很长时间?
- 这是一个只有 linux 机器里才跳出来的蜕变脚本的臭虫。
- 据我所知有两个绕过去的办法
- (是 Tatsuo Ishii 告诉我的):
- 1. 修改 regress.sh 里下面的行:
- time postgres -texecutor -tplanner -Q bench & bench.out.perquery
- 3.10) 为什么在一些日期/时间运算中我得到一些有趣的圆整?例如
- select '4 hours'::timespan;
- returning '3 hours 59 minutes 60 seconds'?
- 你正使用新的 glibc2 库,而且版本早于 2.0.7。这是一个该库的数学圆整问题。升级你的库。
复制代码 |
|