【问题标题】:Makefile does not work on mac os x MavericksMakefile 在 mac os x Mavericks 上不起作用
【发布时间】:2013-10-23 15:10:27
【问题描述】:

我有一个项目,它使用 opencv 库。今天我已经将我的 Mac OS X Lion 升级到了 Mavericks,现在我想知道为什么它因为以下错误而不再编译:

c++ -O2 -g -Wall -fmessage-length=0    -c -o Hello.o Hello.cpp
Hello.cpp:2:10: fatal error: 'opencv/cv.h' file not found
#include "opencv/cv.h"
         ^
1 error generated.
make: *** [Hello.o] Error 1

Hello.cpp的代码如下:

#include <iostream>
#include "opencv/cv.h"

using namespace std;

int main(){
    return 0;
}

这是我的生成文件:

CXXFLAGS =  -O2 -g -Wall -fmessage-length=0 

OBJS =      Hello.o

LIBS =  -lopencv_core -lopencv_imgproc -lopencv_calib3d -lopencv_video -lopencv_features2d -lopencv_ml -lopencv_highgui -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_gpu


INCPATH = -I/usr/local/Cellar/opencv/2.4.6.1/include
LIBPATH = -L/usr/local/Cellar/opencv/2.4.6.1/lib

TARGET =    Hello

$(TARGET):  $(OBJS)
    g++ $(INCPATH) $(LIBPATH) -o $(TARGET) $(OBJS) $(LIBS) 


all:    $(TARGET)


clean:
    rm -f $(OBJS) $(TARGET)

我不得不说,我可以通过键入以下内容使用终端编译我的项目:

g++ `pkg-config --cflags opencv` Hello.cpp -o Hello

可以肯定的是,这就是我在终端上运行 pkg-config --cflags opencv 得到的结果:

-I/usr/local/Cellar/opencv/2.4.6.1/include/opencv

【问题讨论】:

  • 不确定是否重要,但您在此处有一个不需要的尾随 /INCPATH = -I/usr/local/Cellar/opencv/2.4.6.1/include/ - 这应该是 INCPATH = -I/usr/local/Cellar/opencv/2.4.6.1/include
  • 您还可以在输入make 后粘贴您在终端中获得的内容的副本吗?
  • @PaulR,感谢您的评论。不,不是的。我已经在问题中修改了
  • 好的 - 让我们看看成绩单...
  • 你可以在问题中看到,我刚刚添加了它

标签: c++ macos opencv makefile


【解决方案1】:

我怀疑这个 makefile 是否有效,除非 MacOSX 的新版本以某种方式将这些标头从标准位置移到了不同​​的位置。

正如 Paul R 所说,您正在使用默认的内置规则,但您没有使用符合这些规则的默认 make 变量。我会这样写我的makefile:

CXX = g++
CXXFLAGS = -O2 -g -Wall -fmessage-length=0 
CPPFLAGS = -I/usr/local/Cellar/opencv/2.4.6.1/include

OBJS =      Hello.o

LDFLAGS = -L/usr/local/Cellar/opencv/2.4.6.1/lib
LDLIBS =  -lopencv_core -lopencv_imgproc -lopencv_calib3d -lopencv_video \
          -lopencv_features2d -lopencv_ml -lopencv_highgui -lopencv_objdetect \
          -lopencv_contrib -lopencv_legacy -lopencv_gpu

TARGET =    Hello

.PHONY: all
all: $(TARGET)
$(TARGET):  $(OBJS)
         $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@

.PHONY: clean
clean:
        rm -f $(OBJS) $(TARGET)

【讨论】:

    【解决方案2】:

    您的 makefile 没有用于构建 Hello.o 的明确规则,因此它使用默认规则。有多种方法可以解决这个问题,但我只想将其更改为:

    CXXFLAGS =  -O2 -g -Wall -fmessage-length=0 
    
    SRCS =      Hello.cpp
    
    LIBS =  -lopencv_core -lopencv_imgproc -lopencv_calib3d -lopencv_video -lopencv_features2d -lopencv_ml -lopencv_highgui -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_gpu
    
    INCPATH = -I/usr/local/Cellar/opencv/2.4.6.1/include
    LIBPATH = -L/usr/local/Cellar/opencv/2.4.6.1/lib
    
    TARGET =    Hello
    
    $(TARGET):  $(SRCS)
        g++ $(CXXFLAGS) $(INCPATH) $(LIBPATH) -o $(TARGET) $(SRCS) $(LIBS) 
    
    all:    $(TARGET)
    
    clean:
        rm -f $(TARGET)
    

    【讨论】:

    • 这不是一个好的答案。它适用于单个源文件(应该是 Hello.cpp 而不是 Hello.c),但如果你有 >1 个源文件,那就不对了。
    • @MadScientist:实际上它适用于多个源文件(试试看!),但不可否认,如果你有多个源文件,它就会变得笨拙。我打算对 OP 的 makefile 进行最少的更改,但从长远来看,您的答案当然更具可扩展性。
    • 我没有说它不起作用:-)。我说它“不对”:这个makefile 并不比shell 脚本好多少。它唯一真正的优势是包含链接行的简单脚本,如果您更改 NO 源文件,它将不会重新链接(但是您多久运行一次 make 而没有更改任何内容?)但是如果您更改任何源文件,它将重新编译所有源文件,所以它不是一个很好的使用make。
    • @PaulR,感谢您的回答,它运作良好,我很感激。
    【解决方案3】:

    亲爱的,我遇到了同样的错误,请看这里:

    C++ linking error after upgrading to Mac OS X 10.9 / Xcode 5.0.1

    非常快速的解决方案:将 -stdlib=libstdc++ 添加到链接命令中。

    【讨论】:

      猜你喜欢
      • 2014-05-06
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 2015-01-03
      相关资源
      最近更新 更多