运行 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。
有什么想法吗?
答案 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
,而您可能不需要将sudo
与make 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。