【问题标题】:file not recognized: File format not recognized文件无法识别:文件格式无法识别
【发布时间】:2013-08-26 07:02:26
【问题描述】:

当我运行 make 文件时出现此错误

"obj/viojournal.o: 文件无法识别: 文件格式无法识别 collect2: ld 返回 1 个退出状态"

make文件如下

如何解决这个问题。 我在 centos 5.4 linx 64bit 机器上使用 gcc 编译器。

all: libvioft.so fdump syncer

CPPFLAGS = -I/usr/include/libxml2 -I../clogger -I../marshall -I../ddp  \
     -I../http -I../xml -I../nfsop  -I../include/common -I../restful \
     -I../include/oneGrid

CFLAGS = -g3 -Wall -Wextra -fPIC -DREPLICATION_ENABLED -DJOURNALING_ENABLED

#CFLAGS = -g3 -Wall -Wextra -fPIC

LDFLAGS = -Wl,-rpath=\$$ORIGIN -Wl,-rpath=\$$ORIGIN/../clogger \
    -Wl,-rpath=\$$ORIGIN/../marshall -Wl,-rpath=\$$ORIGIN/../ddp \
    -Wl,-rpath=\$$ORIGIN/../http  -Wl,-rpath=\$$ORIGIN/../xml \
    -Wl,-rpath=\$$ORIGIN/../restful

LIBS = -lpthread -lssl -lxml2 -lbz2 -L../clogger -lclogger \
    -L../marshall -lmarshall -L../ddp -lddp -L../nfsop -lnfsop

libsources = filefs.c viojournal.c recvReplicaUpdate.c syncer.c hostops.c filetable.c updateRemoteFT.c checkpoint.c 
#libsources = filefs.c viojournal.c hostops.c filetable.c checkpoint.c container.c locks.c

libobjects = $(libsources:%.c=obj/%.o)

fttestsources = fttest2.c
fttestobjects = $(fttestsources:%.c=obj/%.o)

syncersources = syncer.c
syncerobjects = $(syncersources:%.c=obj/%.o)

#dmpsources = viodump.c hostops.c
#dmpobjects = $(dmpsources:%.c=obj/%.o)

libvioft.so: $(libobjects)
    $(CC) $(CFLAGS) -shared -o libvioft.so $(libobjects)

fdump: $(fttestobjects) libvioft.so
    $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) -o fdump $(fttestobjects)

syncer: $(syncerobjects) libvioft.so
    $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) -o syncer $(syncerobjects)

viodump: $(dmpobjects)
    $(CC) $(CFLAGS) $(LDFLAGS) -lpthread -o viodump $(dmpobjects)

clean: 
    rm -rf fttest viodump atar syncer libvioft.so obj

install: 
    cp -f libvioft.so ../package/lib    
#   cp -f syncer ../package/bin

obj/%.d: %.c
    $(SHELL) -ec 'mkdir -p obj && $(CC) -MM $(CPPFLAGS) $(CFLAGS) -MT $(@:.d=.o) -MT $@ $< > $@'

obj/%.o: %.c
    $(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $<

include $(libsources:%.c=obj/%.d)
include $(tstsources:%.c=obj/%.d)
include $(atrsources:%.c=obj/%.d)
#include $(dmpsources:%.c=obj/%.d)

【问题讨论】:

  • 你先尝试make clean了吗?

标签: c makefile


【解决方案1】:

目标文件似乎以某种方式损坏。尝试删除它以强制重建它,或者按照@devnull 的建议,执行make clean

【讨论】:

  • 感谢您的建议,制作文件是否有问题...??
  • @harish013 我不会说Makefile,抱歉。我使用 CMake 之类的东西来make 我的生活更轻松;-)
【解决方案2】:

(我会将此建议作为评论,但我还没有足够的声誉)

我最近遇到了这个错误,我有一些建议可能会有所帮助。

在我的情况下,有问题的makefile(s) 需要不同的CFLAGS,具体取决于安装是 64 位还是 32 位。以下是README中的一些行

By default, the C/C++ software are compiled in 32 bits with the options (-Os) but can be compiled in 64 bits, -m64 is added to the CFLAGS variable in &lt;certain makefiles in the project are listed&gt;

我的建议是首先尝试将-m64 添加到您的CFLAGS。如果这不起作用,请删除 -m64 并将其替换为 -Os

也就是说,首先尝试使用以下行:

CFLAGS = -g3 -Wall -Wextra -fPIC -DREPLICATION_ENABLED -DJOURNALING_ENABLED -m64

然后,从命令行运行

make clean

之后是您用于安装的任何 make 命令。

如果这不起作用,请将相关行更改为

CFLAGS = -g3 -Wall -Wextra -fPIC -DREPLICATION_ENABLED -DJOURNALING_ENABLED -Os

然后是make clean 和其他make 的东西。

如果有些C对象是64位的,有些是32位的(我不知道这种情况是否真的存在),你可能需要做一些不同的事情。

这在我的情况下有效,您可以查看here的详细信息。

请发表评论,让我知道它是否适合您。

【讨论】:

    猜你喜欢
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2013-06-12
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 2011-05-25
    相关资源
    最近更新 更多