我一直在研究这个问题已有一段时间了,我希望有人可以指出我缺少的东西。
$ make clean && make libvpnpp.a
c++ -arch x86_64 -arch i386 -I. -I/usr/local/include/ -c VpnInit.cpp
libtool -static -o libvpnpp.a VpnInit.o
libvpnpp.a
make: libvpnpp.a: No such file or directory
make: *** [libvpnpp.a] Error 1
但是,当我执行ls
时,库就是:
$ ls *.a
libvpnpp.a
是 multiarch:
$ lipo -info libvpnpp.a
Architectures in the fat file: libvpnpp.a are: x86_64 i386
以下是相关的makefile规则和配方:
IS_DARWIN = $(shell uname -s | $(EGREP) -i -c "Darwin")
ifeq ($(IS_DARWIN),1)
CXXFLAGS += -arch x86_64 -arch i386
AR = libtool
ARFLAGS = -static -o
endif
...
libvpnpp.a: $(VPNPP_LIB_OBJS)
$(AR) $(ARFLAGS) $@ $(VPNPP_LIB_OBJS)
$(RANLIB) $@
...
%.o : %.cpp
$(CXX) $(CXXFLAGS) -I$(VPNPP_INCL) -I$(CRYPTOPP_INCL) -c $<
为什么make
会因No such file or directory
而失败,即使该库已创建并存在?
这是来自make -d
的尾巴:
...
c++ -arch x86_64 -arch i386 -I. -I/usr/local/include/ -c VpnInit.cpp
Putting child 0x7fe669c0ff10 (VpnInit.o) PID 59119 on the chain.
Live child 0x7fe669c0ff10 (VpnInit.o) PID 59119
Reaping winning child 0x7fe669c0ff10 PID 59119
Removing child 0x7fe669c0ff10 PID 59119 from chain.
Successfully remade target file `VpnInit.o'.
Finished prerequisites of target file `libvpnpp.a'.
Must remake target `libvpnpp.a'.
libtool -static -o libvpnpp.a VpnInit.o
Putting child 0x7fe669c111d0 (libvpnpp.a) PID 59127 on the chain.
Live child 0x7fe669c111d0 (libvpnpp.a) PID 59127
Reaping winning child 0x7fe669c111d0 PID 59127
libvpnpp.a
make: libvpnpp.a: No such file or directory
Live child 0x7fe669c111d0 (libvpnpp.a) PID 59138
Reaping losing child 0x7fe669c111d0 PID 59138
make: *** [libvpnpp.a] Error 1
Removing child 0x7fe669c111d0 PID 59138 from chain.
$
答案 0 :(得分:1)
看起来$(RANLIB)
为空,然后行$(RANLIB) $@
解析为libvpnpp.a
。作为一行中的第一个单词,shell想要执行一个名为libvpnpp.a
的程序,它找不到它(可能是因为.
不在PATH
中)。
尝试在makefile中设置RANLIB=:
或作为make变量。或者调查RANLIB
未正确设置的原因。