当我运行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)
答案 0 :(得分:8)
似乎对象文件以某种方式被破坏了。尝试删除它以强制重建它,或者@devnull建议,执行make clean
。
答案 1 :(得分:0)
(我会把这个建议作为评论,但我还没有足够的声望,但
)我最近遇到了这个错误,我提出了一些可能会有所帮助的建议。
就我而言,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 <certain makefiles in the project are listed>
我的建议是先尝试将-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的详细信息。
如果有效,请发表评论告诉我。