没有这样的文件或目录但存在库?

时间:2014-07-28 12:27:02

标签: macos makefile static-libraries

我一直在研究这个问题已有一段时间了,我希望有人可以指出我缺少的东西。

$ 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.
$ 

1 个答案:

答案 0 :(得分:1)

看起来$(RANLIB)为空,然后行$(RANLIB) $@解析为libvpnpp.a。作为一行中的第一个单词,shell想要执行一个名为libvpnpp.a的程序,它找不到它(可能是因为.不在PATH中)。

尝试在makefile中设置RANLIB=:或作为make变量。或者调查RANLIB未正确设置的原因。