【问题标题】:Order in Makefile在 Makefile 中订购
【发布时间】:2015-11-04 19:26:32
【问题描述】:

我正在尝试在 ubuntu 14.04 上为 opencv 文件编写 makefile

这是一个例子: Makefile to Compile OpenCV Code in C++ on Ubuntu/Linux

如果我尝试以这种形式使用它:

CFLAGS = `pkg-config --cflags opencv`
LIBS = `pkg-config --libs opencv`

% : %.cpp
        g++ $(CFLAGS) $(LIBS) -o $@ $<

我明白了

make: *** 没有目标。停下来。

如果我尝试

IFLAGS = `pkg-config --cflags opencv`
LFLAGS = `pkg-config --libs opencv`

all: minimal

minimal: minimal.cpp
    g++ $(IFLAGS) $(LFLAGS) -o minimal minimal.cpp

我明白了

g++ `pkg-config --cflags opencv` `pkg-config --libs opencv` -o minimal minimal.cpp
/tmp/ccKWVtBh.o: In function `main':
minimal.cpp:(.text+0x4d): undefined reference to `cv::imread(std::string const&, int)'
minimal.cpp:(.text+0x123): undefined reference to `cv::imwrite(std::string const&, cv::_InputArray const&, std::vector<int, std::allocator<int> > const&)'
minimal.cpp:(.text+0x1a6): undefined reference to `cv::imshow(std::string const&, cv::_InputArray const&)'
minimal.cpp:(.text+0x1ce): undefined reference to `cv::waitKey(int)'
/tmp/ccKWVtBh.o: In function `cv::Mat::~Mat()':
minimal.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x39): undefined reference to `cv::fastFree(void*)'
/tmp/ccKWVtBh.o: In function `cv::Mat::operator=(cv::Mat const&)':
minimal.cpp:(.text._ZN2cv3MataSERKS0_[_ZN2cv3MataSERKS0_]+0x111): undefined reference to `cv::Mat::copySize(cv::Mat const&)'
/tmp/ccKWVtBh.o: In function `cv::Mat::release()':
minimal.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x47): undefined reference to `cv::Mat::deallocate()'
/tmp/ccKWVtBh.o: In function `cv::_InputArray::_InputArray<unsigned char>(cv::Mat_<unsigned char> const&)':
minimal.cpp:(.text._ZN2cv11_InputArrayC2IhEERKNS_4Mat_IT_EE[_ZN2cv11_InputArrayC5IhEERKNS_4Mat_IT_EE]+0x17): undefined reference to `vtable for cv::_InputArray'
/tmp/ccKWVtBh.o: In function `cv::Mat_<unsigned char>::operator=(cv::Mat const&)':
minimal.cpp:(.text._ZN2cv4Mat_IhEaSERKNS_3MatE[_ZN2cv4Mat_IhEaSERKNS_3MatE]+0x77): undefined reference to `cv::Mat::reshape(int, int, int const*) const'
minimal.cpp:(.text._ZN2cv4Mat_IhEaSERKNS_3MatE[_ZN2cv4Mat_IhEaSERKNS_3MatE]+0xdd): undefined reference to `cv::Mat::convertTo(cv::_OutputArray const&, int, double, double) const'
/tmp/ccKWVtBh.o: In function `cv::_OutputArray::_OutputArray<unsigned char>(cv::Mat_<unsigned char>&)':
minimal.cpp:(.text._ZN2cv12_OutputArrayC2IhEERNS_4Mat_IT_EE[_ZN2cv12_OutputArrayC5IhEERNS_4Mat_IT_EE]+0x2a): undefined reference to `vtable for cv::_OutputArray'
collect2: error: ld returned 1 exit status
make: *** [minimal] Error 1

但如果我使用这种形式,它编译成功

IFLAGS = `pkg-config --cflags opencv`
LFLAGS = `pkg-config --libs opencv`

all: minimal

minimal: minimal.cpp
    g++ $(IFLAGS) -o minimal minimal.cpp $(LFLAGS)

为什么标准的 makefile 示例对我不起作用?我们应该在 makefile 中使用什么顺序的库、包含和 *.cpp?

【问题讨论】:

  • 您列出的第一个 makefile 没有明确的目标,因此当您运行 make 时,make 不知道要构建什么。在您有somefile.cpp 的地方运行make somefile,它将起作用。库在命令行上出现时会被搜索一次。所以他们需要任何使用他们的东西之后。

标签: opencv makefile


【解决方案1】:

您需要CXXFLAGS 而不是CFLAGSLDFLAGS 而不是LIBS。见implicit variables

你的整个 Makefile 可能是

CXXFLAGS = `pkg-config --cflags opencv`
LDFLAGS = `pkg-config --libs opencv`

all: minimal

【讨论】:

  • 他正在使用他设置的标志。这不是问题。
  • @EtanReisner 我以为他在问为什么标准的 makefile 对他不起作用。
  • 我读到这是在问为什么第一个简单的示例 makefile 不起作用。不过,您建议使用内置规则是一个很好的建议。
  • @EtanReisner :) 你可能是对的!我看到你在 SO 上已经有一段时间了。我一直想向某人问这个问题。在这种情况下,我应该删除我的答案,因为它没有回答问题吗?
  • 你可以,但像你所做的那样解释一下 make 具有内置规则并且对于简单的使用,makefile 可以像你展示的那样简单,这可能是值得的。在我看来,这是对“如何获得一个简单的 makefile 来构建针对 opencv 的工作”的“元”问题的有效答案。
猜你喜欢
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多