WordNet:文件是为i386构建的,而不是被链接的架构(x86_64)

时间:2014-05-02 00:29:32

标签: tcl tk wordnet

运行 make 尝试编译WordNet 3.0时出现以下错误:

gcc -m64  -g -O2   -o wishwn  wishwn-tkAppInit.o wishwn-stubs.o -L../lib -lWN -    F/Library/Frameworks -framework Tk -F/Library/Frameworks -framework Tcl -lpthread -framework CoreFoundation -framework Cocoa -framework Carbon -framework IOKit  -lz  -lpthread -framework CoreFoundation  
ld: warning: ignoring file /Library/Frameworks/Tk.framework/Tk, file was built for i386 which is     not the architecture being linked (x86_64): /Library/Frameworks/Tk.framework/Tk
Undefined symbols for architecture x86_64:
  "_Tk_Init", referenced from:
  _Tcl_AppInit in wishwn-tkAppInit.o
  "_Tk_MainEx", referenced from:
  _main in wishwn-tkAppInit.o
  "_Tk_SafeInit", referenced from:
  _Tcl_AppInit in wishwn-tkAppInit.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [wishwn] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

我正在通过ActiveTcl运行Tcl 8.6。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

每个可执行文件必须(在所有正常情况下)为单个体系结构构建,例如,仅用于i386(32位Intel-ish)或x86_64(64位Intel-ish)虽然可以让单个CPU支持多种体系结构,但它们之间的切换正式是上下文切换,因此只在OS内核和代码之间进行。 (有些平台 - 特别是OSX--支持多架构二进制文件 - “胖”二进制文件 - 过去,但这非常像拥有一个元架构,而你现在不应该这样做。)这反过来表示链接的库(无论是否共享库)必须匹配您正在构建的体系结构。

不幸的是,您尝试实际使用的库是针对不同的体系结构构建的:您尝试链接的ActiveState构建看起来像i386,但您正在尝试制作64位版本。 那不行。

最简单的方法可能是获取Tcl和Tk的源代码并在您想要的配置中构建它们;这就是我在OSX上做的事情,而且很简单。从official release location on SourceForge获取来源。要为OSX构建Tcl,请运行:

cd tcl8.6.1/unix
./configure --prefix=/where/you/will/install --enable-64bit
make
make test
sudo make install

您可以传递--enable-framework进行配置(但我不会),您可以省略make test,而您可能不需要将sudomake install一起使用(这取决于你要安装的地方。

对于Tk,你可以:

cd tk8.6.1/unix
./configure --prefix=/where/you/will/install --enable-64bit --enable-aqua
make
sudo make install

可能需要传递--with-tcl=/location/of/tclConfig.sh(这是您刚刚安装的tclConfig.sh),但是如果您放入Tk,构建脚本会自动找到它Tcl来源旁边的消息来源。有一个Tk的测试套件,但它比Tcl更具侵入性(因为它必须弹出窗口,窃取焦点,抓住鼠标指针,那种东西;它是一个GUI工具包,所以你应该期待那种事情)这意味着我完全可以理解你运行单元测试。

答案 1 :(得分:1)

确保在lib的Build设置中的Architectures中列出了i386和x86_64。同时将Build Active Architecture明确设置为No。