编译LFS时遇到问题,在网上看到这篇帖子,竟然在这篇帖子中找到了答案,呵呵,这里就拿来分享了。个人认为总结的还不错
1.1) 我需要对 src/Makefile.global 或
src/Makefile.custom 文件做什么修改以及我还需要做其他修改吗?
1.2) 为什么我在缺少 libreadline 时会有麻烦?
1.3) [REDHAT] 为什么我缺少 libdl 和 dlfcn.h 时会有麻烦?
1.4) [SLACKWARE 3.1] 为什么我缺少 libdl 和 dlfcn.h 时会有麻烦?
1.5) 我编译后端时退出了,并且报错说缺少头文件dlfcn.h
1.6) GCC 抱怨说选项 -fpic 被忽略
1.7) 我收到下面形式的警告
warning: cast from pointer to integer of different size
1.8) [SuSE-Linux 4.2-4.4] curses 和 termcap 在那里?
1.9) 为什么我的 ld.so 有问题?
1.10) 为什么我收到 `yy_flush_buffer undefined' 错误?
1.11) 我怎样在一个 a.out 系统上编译 PostgreSQL ?
1.12) 为什么制作带着下面信息退出:
yacc -d /disk2/PostgreSQL/src/backend/parser/gram.y
make: /usr/bin/make: cannot execute binary file
1.13) 在 src/Makefile.global 里 X11_LIB 对 libsocket 和 libnsl 的引用在那里?
1.14) [DEBIAN] libtermcap 在那里?
1.15) [REDHAT] 我能把 PostgreSQL 做成 RPM 吗?
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
1.17) 当编译 postgres 时,gcc 报告信号 11 并退出。
1.18) 我能否在 MkLinux 里安装 6.1.1?
1.19) 为什么制作退出或崩溃?
1.20) 我如何为 486 或 pentium 处理器做优化?
1.21) 为什么我打印时间时会得到奇怪的结果(例如
在蜕变测试 'timespan' 时)?
1.22) 为什么我编译 6.3.2 时为什么我没有生成任何 libqp 的共享库?
1.23) 为什么编译失败,并且说 F_BOOLIN,F_BOOLOUT 和 F_BYTEAIN 未定义?
2.1) 在编译 pgtclsh 时,链接器没有找到 libX11
3.1) 在运行象 createuser 这样的脚本时,我收到一个错误,说 _fUnKy_POSTPORT_sTuFf_ 未定义
3.2) 我运行 postmaster 然后系统告诉我 'Bad system call(Core dumped)'(系统调用错误(内核倾倒))
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.
3.4) 为什么 createuser 不管用?
3.5) 为什么我会收到下面这样的信息:
IpcMemoryCreate: memKey=155356396 , size=760632 ,
permission=384IpcMemoryCreate: shmget(..., create, ...)
failed: Invalid argument
3.6) 为什么 psql 带着下面的错误信息失效了:
psql: can't load library 'libpq.so.1'
3.7) 其他奇怪的表现
3.8) 当 PostgreSQL 运行时宕掉系统,重起时 Linux
总是对磁盘进行 fsck。
3.9) 为什么蜕变测试中 Query 32 用了很长时间?
3.10) 为什么在一些日期/时间运算中我得到一些有趣的圆整?
例如
select '4 hours'::timespan;
returning '3 hours 59 minutes 60 seconds'?
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 (~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上看到这个毛病。
关于这个问题的更多信息在:
通过这个 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。这是一个该库的数学圆整问题。升级你的库。
阅读(2767) | 评论(0) | 转发(0) |