常见疑问(F.A.Q.) - 6. 一般性编译问题
Q6.1: 一个配置脚本出错说找不到一个 "acceptable cc"。什么意思?
A:
下次应该阅读一下文档。
要从源代码编译软件包,你需要安装开发工具包,其中就包括 C 编译器:cc
。
Q6.2: 我运行 "fink selfupdate-cvs",但出现这个错误:"cvs: Command not found."。
A: 你需要安装开发工具包。
Q6.3: 我碰到一个涉及 make
的错误。
A: 如果错误信息是这种形式
make: command not found
或
Can't exec "make": No such file or directory at /opt/sw/lib/perl5/Fink/Services.pm line 190.
它表示你需要安装开发工具。
如果你的错误信息是这样的
make: illegal option -- C
那是因为你把开发工具包里面 GNU 版本的 make
工具换成了 BSD 版本。许多软件包依赖于 GNU Make 的特有功能。
确定 /usr/bin/make
是一个指向
gnumake
的符号链接,而不是指向 bsdmake
。另外,确定 /usr/local/bin/
中没有另外一个 make
。
Q6.4: 我碰到 head 命令的一个奇怪的错误信息。什么出问题了?
A: 如果你看到的是:
Unknown option: 1 Usage: head [-options] <url>...
后面是一列选项描述,你的 head
程序被损坏了。
这会在你安装 Perl 的 libwww 库到一个 HFS+ 系统宗卷时发生。
原因是它会建立一个新的命令 /usr/bin/HEAD
,它会覆盖现存的 head
命令,因为 HFS+ 是不区分大小写的。
head
是一个在许多 shell 脚本和 Makefiles 中用到的标准命令。
如果你想使用 Fink,你需要装回原来的 head
程序。
现在源代码发布版的 bootstrap 脚本会检查这一点,但你仍然会碰到这个问题,如果你使用二进制安装或在安装 Fink 以后又安装 libwww。
也曾经有报告说发生这个问题是因为安装了 /opt/sw/bin/HEAD
(这不是 Fink 软件包安装的)。这种情况很容易解决:重命名 /opt/sw/bin/HEAD
。
Q6.5: 当我安装一个软件包的时候,我碰到一个错误信息说我试图覆盖另外一个软件包的文件。
A: 当你安装那些具有版本分支的软件包(也就是那些名字末尾有 -dev,-shlibs,等的)时,如果需要有些文件从一个版本分支移动到另一个版本分支(例如,从 foo
到 foo-shlibs
)的时候,你就会碰到这个错误。你可以做的是使用你现在安装的版本来覆盖旧有的版本(因为他们通常是相同的):
sudo dpkg -i --force-overwrite 文件名
这里文件名 filename 是对应于你要安装的软件包的 .deb 文件名称。
Q6.6: 当我构建一个软件包时,"execution of mv failed, exit code 1" 错误是什么意思?
A: 如果你安装了 StuffIt Pro,这可能是因为你使用了 "Archive Via Real Name" 模式。在系统预置中检查 StuffIt 面板,禁用 "ArchiveViaRealName"。它包括对一些重要的系统调用的不正确的替代,从而引起一些古怪的错误。
否则,一个 mv
错误通常意味着构建过程更早期发生了错误,但是构建过程并没有因为那个错误而终止。要找到发生的问题的文件,可以搜索那个不存在文件构建时候的输出。比如,如果你碰到这样的错误:
mv /opt/sw/src/root-foo-0.1.2-3/opt/sw/lib/libbar*.dylib \ /opt/sw/src/root-foo-shlibs-0.1.2-3/opt/sw/lib/ mv: cannot stat `/opt/sw/src/root-foo-0.1.2-3/opt/sw/lib/libbar*.dylib': No such file or directory ### execution of mv failed, exit code 1 Failed: installing foo-0.1.2-3 failed
那么你应该在你构建输出信息的更前面的地方寻找有关 libbar
的信息。
Q6.7: 我无法安装软件包或更新它,因为我碰到一个错误说一个 "node" 已经存在。
A: 这个错误的大约是这个样子的:
Failed: Internal error: node for system-xfree86 already exists
这个问题是因为依赖关系引擎发生了混乱,原因是修改了某些软件包的 info 文件。要修正它:
-
强行删除出现问题的软件包,例如,对于上面的例子,可以:
sudo dpkg -r --force-all system-xfree86
-
再尝试安装或升级。有时会提示一个包含你删除了的软件包的 "virtual dependency"。选择它,它会在构建过程中重新被安装。
Q6.8: 我听说安装在 /usr/local/lib 的库有时会引起 Fink 构建的问题。是这样吗?
A: This is a frequent source of problems, because the package
configuration script finds headers and libraries in
/usr/local
and decides to use them rather than using those in the Fink path.
If you are having problems with a build that aren't covered by another
FAQ entry, you should check whether you have libraries in
/usr/local/lib
or headers in /usr/local/include. If so, then try renaming
/usr/local
to something else, e.g.:
sudo mv /usr/local /usr/local.moved
完成你的构建,然后把 /usr/local
改回来:
sudo mv /usr/local.moved /usr/local
Starting with macOS 10.14, it's sometimes not possible to rename /usr/local
. If you get an error when renaming /usr/local
directly, then rename the subdirectories inside it instead:
sudo mv /usr/local/include /usr/local/include.moved sudo mv /usr/local/lib /usr/local/lib.moved
do your build, and then you can put /usr/local/include
and /usr/local/lib
back:
sudo mv /usr/local/include.moved /usr/local/include sudo mv /usr/local/lib.moved /usr/local/lib
Q6.9: 当我构建一个软件包的时候,我碰到一个消息说 "table of contents" 已经过时。我需要怎么办?
A: 输出已经提示了该怎么办。消息通常是这样的:
ld: table of contents for archive: /opt/sw/lib/libintl.a is out of date; rerun ranlib(1) (can't load from it)
你需要(以 root 权限)运行 ranlib 处理引起问题的库。例如对上面的情况,你可以运行:
sudo ranlib /opt/sw/lib/libintl.a
Q6.10: 当我安装 atlas 时 Fink Commander 挂了。
A: 这原因时在构建 atlas
时,Fink Commander 遗漏了一个发向用户要求选择的信息。你需要使用 fink install atlas
命令来安装。
Q6.11: I get messages saying that I'm missing stddef.h
| wchar.h
| stdlib.h
| crt1.o
, or that my C compiler cannot create executables
.
A: Both of these problems are typically due to the absence of essential headers that are provided by the DevSDK package of
the Developer Tools. Check whether
/Library/Receipts/DevSDK.pkg
exists on your
system. If not, then run the Dev Tools Installer again, and install
the DevSDK package using a Custom Install.
The cannot create executables
error can also occur when your Developer Tools version is for an earlier OS version.
Q6.12: 我无法升级,因为 Fink "unable to resolve version conflict on multiple dependencies"。
A: 要回避这个问题,尝试升级一个单独的软件包,然后再次尝试使用 "fink update-all"。如果你还碰到这个信息,重复这个过程。
Q6.13: 我不能安装任何东西,因为我碰到 "dpkg: parse error, in file `/opt/sw/var/lib/dpkg/status'" 错误!
A: This means that somehow your dpkg database got damaged, usually from a crash or some other unrecoverable error. This most often occurs with a buildlock, e.g:
package `fink-buildlock-foo-1.2.3-4': missing version
(of course, replace foo-1.2.3-4
with the package name you are seeing).
When this happens, you should edit /opt/sw/var/lib/dpkg/status
as a superuser.
Then go near the line number which shows up in the error message.
You should see a fink-buildlock-foo-1.2.3-4
package whose Status
field is marked
install ok installed
Change that to
purge ok not-installed
Under other circumstances, there may be garbage in the file. You can fix this situation by copying the previous version of the database, like so:
sudo cp /opt/sw/var/lib/dpkg/status-old /opt/sw/var/lib/dpkg/status
You may need to re-install the last couple of packages you installed before the problem started occurring.
Q6.14: 我碰到一个涉及 freetype 的错误。
A: 这个错误有几种形式。If you get the following:
/usr/bin/ld: can't locate file for: -lfreetype
check whether you have an extraneous freetype-config
excutable by running
where freetype-config
if you're using tcsh
, or
type -a freetype-config
if you're using bash
. The Mono Framework has been known to install a /usr/bin/freetype-config
that is a symbolic link to a file in that framework.
如果你的错误是这样的:
/opt/sw/include/pango-1.0/pango/pangoft2.h:52: error: parse error before '*' token /opt/sw/include/pango-1.0/pango/pangoft2.h:57: error: parse error before '*' token /opt/sw/include/pango-1.0/pango/pangoft2.h:61: error: parse error before '*' token /opt/sw/include/pango-1.0/pango/pangoft2.h:86: error: parse error before "pango_ft2_font_get_face" /opt/sw/include/pango-1.0/pango/pangoft2.h:86: warning: data definition has no type or storage class make[2]: *** [rsvg-gz.lo] Error 1 make[1]: *** [all-recursive] Error 1 make: *** [all-recursive-am] Error 2 ### execution of make failed, exit code 2 Failed: compiling librsvg2-2.4.0-3 failed
或
In file included from vteft2.c:32: vteglyph.h:64: error: parse error before "FT_Library" vteglyph.h:64: warning: no semicolon at end of struct or union vteft2.c: In function `_vte_ft2_get_text_width': vteft2.c:236: error: dereferencing pointer to incomplete type vteft2.c: In function `_vte_ft2_get_text_height': vteft2.c:244: error: dereferencing pointer to incomplete type vteft2.c: In function `_vte_ft2_get_text_ascent': vteft2.c:252: error: dereferencing pointer to incomplete type vteft2.c: In function `_vte_ft2_draw_text': vteft2.c:294: error: dereferencing pointer to incomplete type vteft2.c:295: error: dereferencing pointer to incomplete type make[2]: *** [vteft2.lo] Error 1 make[1]: *** [all-recursive] Error 1 make: *** [all] Error 2 ### execution of make failed, exit code 2 Failed: compiling vte-0.11.10-3 failed
或
checking for freetype-config... /usr/X11R6/bin/freetype-config checking For sufficiently new FreeType (at least 2.0.1)... no configure: error: pangoxft Pango backend found but did not find freetype libraries make: *** No targets specified and no makefile found. Stop. ### execution of LD_TWOLEVEL_NAMESPACE=1 failed, exit code 2 Failed: compiling gtk+2-2.2.4-2 failed
问题发生在 freetype
或 freetype-hinting
软件包的头文件和包含在 X11 或 XFree86 中的 freetype2
头文件之间发生混淆。
fink remove freetype freetype-hinting
命令可以删除你安装的(导致问题的)变种。如果你的错误是这样的:
ld: Undefined symbols: _FT_Access_Frame
这通常是用于以前安装的 X11 的残余文件。你需要重新安装 X11 SDK。
Q6.15: 我碰到一个涉及 `Dl_info' 的编译错误。
A: 如果你的错误是这样的
unix_dl.c: In function `rep_open_dl_library': unix_dl.c:328: warning: assignment discards qualifiers from pointer target type unix_dl.c: In function `rep_find_c_symbol': unix_dl.c:466: error: `Dl_info' undeclared (first use in this function) unix_dl.c:466: error: (Each undeclared identifier is reported only once unix_dl.c:466: error: for each function it appears in.) unix_dl.c:466: error: parse error before "info" unix_dl.c:467: error: `info' undeclared (first use in this function) make[1]: *** [unix_dl.lo] Error 1
最可能是你有这样的一个头文件:/usr/local/include/dlfcn.h
,它和 Panther 不兼容。
这一般是由 Open Office 所安装的,你应该通过符号链接把这个头文件和对应的 /usr/local/lib/libdl.dylib
库指向 Panther 的内置文件
sudo ln -s /usr/include/dlfcn.h /usr/local/include/dlfcn.h sudo ln -s /usr/lib/libdl.dylib /usr/local/lib/libdl.dylib
Q6.16: Fink says I'm missing gcc2
or gcc3.1
but I can't seem to
install it.
A: This is because gcc2
and gcc3.1
are virtual packages to
indicate the presence of gcc-2.95 and gcc-3.1, respectively, on your system. Install the gcc2.95 and/or the gcc3.1
package from the XCode Tools (earlier OS versions have gcc-2.95 and gcc-3.1 as
part of their main Developer Tools installation).
Note: Installing gcc2.95 and/or gcc3.1 will not interfere with your gcc3.3 compiler--they can all coexist.
Q6.17: Fink 提示说 Failed: Can't resolve dependency "system-java14-dev"
,但我却找不到有这个软件包。
A: 这是因为它是一个虚拟软件包。 这类错误在 Java 通过软件更新升级后造成的: 有关的头问题被删除了,引起不能生成 -dev 软件包。
你需要自己从苹果网站下载相应的Java 开发工具
软件包。在本例的情况中,你需要Java 1.4.2 Developer Tools
。
Q6.18: 当我尝试安装东西的时候,我碰到 dpkg (subprocess): failed to exec dpkg-split to see if it's part of a multiparter: No such file or directory
这样的错误。我怎么修复它?
A: 通常来说,这可以通过正确设置你的环境变量来修复。参考 这个 FAQ 条目。
Q6.19: 我碰到这个 configure: error: XML::Parser perl module is required for intltool
错误信息。我应该怎么办?
A: You need to make sure that you have the right variant of the xml-parser-pm package to match the Perl version for your system. For example, if you're on Panther you should have xml-parser-pm581
rather than xml-parser-pm560
(you may also have the xml-parser-pm
placeholder), since you have Perl-5.8.1
rather than Perl-5.6.0
. If you're on Jaguar, and are using the default system Perl version, you'll have the pm560
variant, and if you've installed Perl 5.8.0
you may have the pm580
variant.
Q6.20: I'm trying to download a package, but Fink goes to some weird site with distfiles
in its name, and the file isn't there.
A: What's happened here is that Fink is trying to use one of it's so called Master
mirrors. These were set up to makes sure that sources for Fink packages are available even when the upstream site has moved them around. Typically these errors occur when a new upstream version of a package is released, but hasn't made it to the Master mirrors yet.
To remedy this, run fink configure
and set the search order to use Master mirrors last.
Q6.21: I want Fink to use different options in building a package.
A: The first thing to do is to contact the package maintainer to request a variant. It may be relatively easy to do it. If you don't hear from the maintainer or see the new packages, or want to try a different option yourself, check out the Packaging Tutorial and Packaging Manual.
Note: Fink is deliberately set up such that all official binaries are identical regardless of what machine they are built on, so things like G5 optimization won't happen with an official package. If you want them, you'll have to do it yourself.
Q6.22: Whenever I try to build from source, Fink keeps waffling between alternate versions of the same library.
A: Often, in a complicated build tree, you may find that some of the packages
depend on a particular version of a library, and other depend on a different one
(e.g. db47
vs. db44
). Consequently, Fink may try to
switch to whichever one isn't currently installed in order to satisfy the
build dependency for the current package that you're trying to update.
Unfortunately, due to limitations in the build-dependency engine, you may wind up with the dreaded
Fink::SysState: Could not resolve inconsistent dependencies
message when trying a sufficiently complicated update-all
. This generally gives you a
command to try to resolve the issue:
fink scanpackages sudo apt-get update sudo apt-get install foo=1.23-4
but this may not work for sufficiently complicated updates. You might need to update packages one-by-one, at least for a while.
Q6.23: I get errors involving MACOSX_DEPLOYMENT_TARGET
when I try to build a Python module.
A: For errors that look like the following:
running build running build_ext Traceback (most recent call last): File "setup_socket_ssl.py", line 21, in ? depends = ['socketmodule.h'] ) File "/opt/sw/src/root-python24-2.4.1-1/opt/sw/lib/python2.4/distutils/core.py", line 166, in setup SystemExit: error: $MACOSX_DEPLOYMENT_TARGET mismatch: now "10.4" but "10.3" during configure ### execution of /opt/sw/bin/python2.4 failed, exit code 1
the problem occurs because the python2*
packages write the current MACOSX_DEPLOYMENT_TARGET
to a configuration file when they're built and the python build utilities use this value when compiling modules. This means that if you have, for example, a python24
package on 10.4 that was built on 10.3, either by upgrading 10.3 => 10.4, or via the 10.4-transitional binary distribution, in which python24
wasn't rebuilt, there will be a mismatch between what python thinks MACOSX_DEPLOYMENT_TARGET
should be (10.3) and what it actually is (10.4).
The fix is to rebuild the offending python
package, e.g. fink rebuild python24
for the case above.
Q6.24: I get unrecognized option `-dynamic'
errors from libtool
.
A: This error:
libtool: unrecognized option `-dynamic'
typically means that you've replaced Apple's /usr/bin/libtool
with a GNU libtool
. Unfortunately, the two libtools
do not do the same thing.
The only way to solve this is to get a working Apple libtool
from somewhere. It is installed as part of the DeveloperTools.pkg
package of the XCode Tools, and you can reinstall that whole package if you first clear out its receipt in /Library/Receipts
(drag it to the Trash for OS 10.4 and later, or use sudo rm -rf /Library/Receipts/DeveloperTools.pkg
for 10.3).
Next: 7. 编译问题-特定软件包