在运行make命令时,我得到以下输出,
g++ -DUNIX -Wall -g -I../include -I. main.o hfpage.o hfp_driver.o test_driver.o db.o new_error.o page.o system_defs.o buf.o -o hfpage
/usr/bin/ld: Warning: size of symbol `error_string_table::error_string_table(Status, char const**)' changed from 18 in db.o to 34 in buf.o
/usr/bin/ld: i386:x86-64 architecture of input file `buf.o' is incompatible with i386 output
collect2: ld returned 1 exit status
make: *** [hfpage] Error 1
这个文件生成hfpage.o,当我尝试使用./hfpage.o
运行时,我得到和错误消息bash: ./hfpage.o: cannot execute binary file
。
我的系统有问题吗?
好的,首先,错误消息说buf.o
是为另一种架构编译的,可能是 32 位机器上的 64 位。
无法运行./hprof.o
的原因是hprof.o
是二进制对象,而不是可执行文件。 如果此编译已完成,由于您没有-o
标志,可执行文件将被命名为 a.out
由于历史原因,这是 UNIX 可执行文件的默认名称。
您的问题可能出现在 make 文件的早期步骤中。 基本上,你应该有几行,比如
main.o:
g++ -DUNIX -Wall -g -I../include -I. -c main.C
然后是最后一行,比如
main:
g++ -DUNIX -Wall -g -o main main.o hfpage.o hfp_driver.o
体系结构消息建议使用不同的编译器或编译器标志编译buf.o
。
您正在尝试使用 x86-64 版本的库为 i386 体系结构构建应用。很可能您错误地安装了 x86-64 库。
看起来链接的文件之一与其他文件的二进制输出不同。 确保在编译时没有为 g++
设置 -m32 or -m64
标志,如果是,则它是一致的。执行此操作后,请运行make clean
并再次make
,以确保它以正确的输出类型重新生成所有二进制文件。
此外,您不应该执行.o
文件,因为它们通常是二进制对象而不是可执行文件。检查生成文件中的目标,找出可执行文件应该是什么。