【问题标题】:Very simple application fails with "multiple target patterns" from Eclipse非常简单的应用程序因 Eclipse 的“多个目标模式”而失败
【发布时间】:2011-01-25 00:14:45
【问题描述】:

因为我更习惯使用 Eclipse,所以我想尝试从 Visual Studio 转换我的项目。昨天我尝试了一个非常简单的小测试。无论我尝试什么,make 都会因“多个目标模式”而失败。 (这类似于this unanswered question。)

我有三个文件:

应用程序.cpp:

using namespace std;

#include "Window.h"

int main() {
    Window *win = new Window();
    delete &win;
    return 0;
}

窗口.h:

#ifndef WINDOW_H_
#define WINDOW_H_

class Window {
public:
    Window();
    ~Window();
};

#endif

Window.cpp:

#include <cv.h>
#include <highgui.h>

#include "Window.h"

const char* WINDOW_NAME = "MyApp";

Window::Window() {
    cvNamedWindow(WINDOW_NAME, CV_WINDOW_AUTOSIZE);
    cvResizeWindow(WINDOW_NAME, 200, 200);
    cvMoveWindow(WINDOW_NAME, 0, 0);
    int key = 0;
    while (true) {
        key = cvWaitKey(0);
        if (key==27 || cvGetWindowHandle(WINDOW_NAME)==0) {
            break;
        }
    }
}
Window::~Window() {
    cvDestroyWindow(WINDOW_NAME);
}

我已将以下路径添加到编译器包含路径(-I):

"$(OPENCV)/cv/include"
"$(OPENCV)/cxcore/include"
"$(OPENCV)/otherlibs/highgui"

我已将以下库添加到链接器 (-l):

cv
cxcore
highgui

以及以下库搜索路径(-L):

"$(OPENCV)/lib/"

Eclipse、编译器和链接器都成功地包含了头文件和库。我正在使用 Cygwin 的 GNU C/C++ 编译器和链接器。

编译时,我收到以下make 错误:

src/Window.d:1: *** multiple target patterns. Stop.

Window.d 包含:

src/Window.d src/Window.o: ../src/Window.cpp \
  C:/Program\ Files/OpenCV/cv/include/cv.h \
  C:/Program\ Files/OpenCV/cxcore/include/cxcore.h \
  C:/Program\ Files/OpenCV/cxcore/include/cxtypes.h \
  C:/Program\ Files/OpenCV/cxcore/include/cxerror.h \
  C:/Program\ Files/OpenCV/cxcore/include/cvver.h \
  C:/Program\ Files/OpenCV/cxcore/include/cxcore.hpp \
  C:/Program\ Files/OpenCV/cv/include/cvtypes.h \
  C:/Program\ Files/OpenCV/cv/include/cv.hpp \
  C:/Program\ Files/OpenCV/cv/include/cvcompat.h \
  C:/Program\ Files/OpenCV/otherlibs/highgui/highgui.h \
  C:/Program\ Files/OpenCV/cxcore/include/cxcore.h ../src/Constants.h \
  ../src/Window.h
C:/Program\ Files/OpenCV/cv/include/cv.h:
C:/Program\ Files/OpenCV/cxcore/include/cxcore.h:
C:/Program\ Files/OpenCV/cxcore/include/cxtypes.h:
C:/Program\ Files/OpenCV/cxcore/include/cxerror.h:
C:/Program\ Files/OpenCV/cxcore/include/cvver.h:
C:/Program\ Files/OpenCV/cxcore/include/cxcore.hpp:
C:/Program\ Files/OpenCV/cv/include/cvtypes.h:
C:/Program\ Files/OpenCV/cv/include/cv.hpp:
C:/Program\ Files/OpenCV/cv/include/cvcompat.h:
C:/Program\ Files/OpenCV/otherlibs/highgui/highgui.h:
C:/Program\ Files/OpenCV/cxcore/include/cxcore.h:
../src/Window.h:

我尝试从 Window.d 中删除所有 OpenCV 标头(从第 2 行开始),但错误仍然存​​在。另外,我更新了 Eclipse 和 OpenCV,都无济于事。

你有什么值得尝试的想法吗?我愿意尝试任何事情!

【问题讨论】:

  • 您可能应该包含 makefile。由于这是来自make 的错误,这可能比实际的 C++ 源代码更重要。

标签: c++ eclipse gcc cygwin makefile


【解决方案1】:

错误“多个目标模式。停止。”会发生是因为 src/Window.d 在 windows 平台下编译器生成的路径为:

C:/Program\ Files/OpenCV/cv/include/cv.h \ C:/Program\ Files/OpenCV/cxcore/include/cxcore.h \ C:/Program\ Files/OpenCV/cxcore/include/cxtypes.h \ C:/Program\ Files/OpenCV/cxcore/include/cxerror.h \

如果您将此项目导入 Linux 平台的 Eclipse,我建议您提供一个干净的构建,以便下一个构建生成 Linux 格式的路径:

/home/user/OpenCV/cv/include/cv.h \ /home/user/OpenCV/cxcore/include/cxcore.h \ /home/user/OpenCV/cxcore/include/cxtypes.h \ /home/user/OpenCV/cxcore/include/cxerror.h \

同样适用,如果您使用的是 cygwin。 cygwin中的路径格式是类似linux的格式/cygdrive/c/而不是C:/

【讨论】:

    【解决方案2】:

    对我有用的一个更改(我使用 Cygwin 和 SSH 终端并行连接到 SVN 服务器)是删除 .d 文件。当我从 Cygwin 拨打 make -f makefile 时,它破坏了一些东西。我通常从 Putty 终端编译,从我的项目中删除 .d 文件后,它停止抱怨多个目标。

    【讨论】:

      【解决方案3】:

      我在 Cygwin 环境中工作,在 Windows 7(64 位)上使用 Eclipse Kepler CDT for C++。

      在 Eclipse 中,转到

      项目 --> 属性 --> C++ Builder --> 设置 --> 工具设置 标签

      Cygwin C++ 编译器 --> 包含

      在包含路径 (-I) 中添加 2 个路径:"C:\cygwin64\usr\include\libxml2"

      "/cygdrive/c\cygwin64\usr\include\libxml2"

      【讨论】:

        【解决方案4】:

        你也可以删除输出文件夹下的*.d文件,然后构建

        Debug/src/
        

        【讨论】:

          【解决方案5】:

          在 windows/cygwin 上使用 eclipse 时,我也遇到了 make 报告的多个目标模式的问题。我只使用相对路径解决了上面建议的问题。我没有意识到我有绝对路径,但是当我使用项目目录指定包含目录时,eclipse 将其扩展为完整路径。

          例如,如果你添加一个相对于工作空间的路径,eclipse 会生成 ""${workspace_loc:/include}"",它会扩展为以 "c:\" 开头的东西。这就是为什么它发生在我的案例中。

          我只是用“../../include”替换了上面的复杂字符串,它解决了我的问题。

          【讨论】:

            【解决方案6】:

            看起来有一种简单的方法可以解决这个问题。 只需在 Project properties->C/C++ Builder->Tool Chain Editor->Current Builder 中将“Current Builder”从“GNU Make Builder”更改为“CDT Internal Builder”即可。

            对我来说,这个问题是由 Debug 目录(或 release :) 中自动生成的“XXX.d”依赖文件引起的,这些文件是由 gcc -MF 作为 gcc -c 的副作用生成的。但是 GNU make 显然忘记在 -MF 时在文件名周围添加引号。

            “CDT Internal Builder”根本不使用makefile 或GNU make。 Eclipse 自己管理构建过程。

            如果你坚持使用 GNU make,这是行不通的

            【讨论】:

              【解决方案7】:

              在 Cygwin 上,默认安装程序提供的 GNU make 版本 3.81-1 不适用于编译器生成的自动头文件依赖项。由于此错误,您将看到的错误消息如下所示:

              以下是两个建议的修复方法: - 尝试获取以前的版本(3.80) - 获取固定的3.81版本,例如从http://www.cmake.org/files/cygwin/make.exe

              src:https://projects.coin-or.org/BuildTools/wiki/current-issues

              只需将“C:\cygwin\bin\”文件夹(或安装 cygwin 的任何位置)中的 make 文件替换为上述“固定”make 文件即可。

              【讨论】:

                【解决方案8】:

                根据其他互联网来源,这与 cygwin make 的 Windows 路径名问题有关,特别是 c:。 对我来说,设置相对路径效果很好。

                例如如果你有类似的东西

                proj/mymodule/headers/afile.h
                proj/mymodule/source/abc/afile.c
                

                只需添加../mymodule/headers/ 作为编译器项目配置中的包含路径,这将找到标头afile.h,并将生成具有相对路径的make文件。 (编译器命令会有 -I../mymodule/headers/ 语句)

                看起来执行目录总是项目基目录。

                【讨论】:

                  【解决方案9】:

                  您是否正在使用 Cygwin 安装?

                  在使用 Cygwin 之前,我已经看到了这个问题——基本上,make 在路径中看到了:,并认为这是另一个目标定义,因此出现了错误。

                  如果您正在使用 Cygwin 安装,您可以尝试将 c:/ 替换为 /cygdrive/c/。如果没有,您可以尝试使用相对路径或使用网络挂载,看看是否能解决问题。

                  【讨论】:

                  • 是的,我正在从 Cygwin 安装运行 GCC。您的答案绝对指向正确的方向。巧合的是,我只是忙着替换C:` with C\:/, but then the compiler simply can't find the headers anymore. The same holds for replacing it with /cygdrive/c/. I'm fairly certain this will resolve the make`的问题,但是我该如何让它们一起工作呢?
                  • 我不知道如何防止 Markdown 被转义。尽管如此,我还是用“C\:/”替换了“C:\”。
                  • 作为测试,我将所有包含和库复制到我的项目路径中。果然,它构建并运行。问题似乎是指定了一个绝对路径。
                  • 当我之前遇到这个问题时,我们通过简单地将所有c:/ 替换为/cygdrive/c 来解决它(包括在它拉入的环境变量中),这解决了我们的问题。我认为您不能将c:/ 格式路径与 GNU make 一起使用(尽管可能有一些特定于 Windows 的构建;我与 Cygwin 的合作不足以知道)。网络挂载可能仍然有效——将c: 映射为c,然后您可以从\\mycomputer\c 访问它。除此之外,我没有想法:(。
                  • 尝试从 Cygwin shell 运行 Eclipse。
                  猜你喜欢
                  • 1970-01-01
                  • 2014-06-07
                  • 2013-10-05
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-11-12
                  • 2017-09-03
                  相关资源
                  最近更新 更多