Ошибка затмения: "make: *** Нет правила, чтобы сделать цель" all ". Стоп." - PullRequest
1 голос
/ 08 мая 2019

Справочная информация для вопроса

Когда я изучал CS в университете, нам пришлось создать проект CBIR с C (и мы получили файл C ++, который выполняет всю «тяжелую работу» по обработке изображений).

Сейчас я пытаюсь создать этот проект на Java.

Я не знал, как реализовать в Java некоторые вещи из этого файла C ++, поэтому я решил использовать JNI и вызвать этот файл из моей программы Java.

Я использую это руководство для JNI: https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html#zz-2.6

Среда разработки

+ Eclipse IDE для разработчиков Java (32-разрядная версия), версия: 2018-09 (4.9.0.было использовать 32-битное затмение)

Проблема

Когда я делаю эту часть учебника:

Щелкните правой кнопкой мыши на «makefile» ⇒ MakeЦели ⇒ Создать ⇒ В поле «Имя цели»> ввести «все».Повторите для создания цели «clean».

Запустите make-файл для цели «all», щелкнув правой кнопкой мыши на make-файле ⇒ Make> Targets ⇒ Build ⇒ Выберите цель «all» ⇒ Build

Кажется, что он работает хорошо.

Но когда я запускаю программу (как было рекомендовано в "Шаг 5: Запустите программу JNI на Java"), хотя программа выводит на консоль, чтоЯ хотел, чтобы после его запуска Eclipse показал мне:

Unresolved inclusion: <jni.h>

как в файле c ++, так и в файле заголовка.

И я проверил, и у меня есть файл jni.h в пути, который я написал в make-файле ("C: \ Program Files (x86) \ Java \ jdk1.8.0_212 \ include").

Кроме того, я хотел бы знать, как выполнить компиляцию после следующих изменений в файлах cpp / h.

Редактировать:

Теперь я заметил, что перед запуском программы существуетa Предупреждение на вкладке «Проблемы»:

Недопустимый путь к проекту: Включить путь не найден (Program Files> (x86) \ Java \ jdk1.8.0_212 \ include).

Но я не понимаю, почему он пишется как «Program Files» вместо «C \ Program Files».

Edit2:

Я создал новый проект в надежде, что онрешит проблему.Когда я «собрал» для цели «все», я получил ошибку:

make: *** No rule to make target `all'.  Stop.

Я увидел, что кто-то предложил проверить «Автоматически генерировать Makefile» (В Свойствах проекта -> Сборка C / C ++)но когда я это сделал, я увидел на консоли «ничего не построить для проекта CBIR2»

Так что я снова «собрал» для цели «все» и каким-то «волшебным» образом эта ошибка исчезла.

Тогда казалось, что запуск в порядке (хотя время выполнения очень большое), но когда я проверил вкладку «Проблемы», я снова увидел ошибку:

make: *** No rule to make target `all'.  Stop.

Поэтому я снова «собрал» для цели «все», и эта ошибка исчезла.

Но, очевидно, что-то здесь не так, если я получаю эту ошибку при каждом запуске программы, а также до первого запуска программы.

makefile

# Define a variable for classpath
CLASS_PATH = ../bin

# Define a virtual path for .class in the bin directory
vpath %.class $(CLASS_PATH)

all : SPImageProc.dll

# $@ matches the target, $< matches the first dependency
SPImageProc.dll : SPImageProc.o
    gcc -Wl,--add-stdcall-alias -shared -o $@ $<

# $@ matches the target, $< matches the first dependency
SPImageProc.o : SPImageProc.cpp SPImageProc.h
    gcc -I"C:\Program Files (x86)\Java\jdk1.8.0_212\include" -I"C:\Program Files (x86)\Java\jdk1.8.0_212\include\win32" -c $< -o $@

# $* matches the target filename without the extension
SPImageProc.h : SPImageProc.class
    javah -classpath $(CLASS_PATH) $*

clean :
    rm SPImageProc.h SPImageProc.o SPImageProc.dll

SPImageProc.cpp

#include <jni.h>
#include <stdio.h>
#include "SPImageProc.h"

JNIEXPORT void JNICALL Java_SPImageProc_saySPImageProc(JNIEnv *env, jobject thisObj) {
   printf("SPImageProc 333!\n");
   return;
}

SPImageProc.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class SPImageProc */

#ifndef _Included_SPImageProc
#define _Included_SPImageProc
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     SPImageProc
 * Method:    saySPImageProc
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_SPImageProc_saySPImageProc
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

CBIR.java

public class CBIR {




   public static void main(String[] args) {

      SPImageProc.example();
   }
}

SPImageProc.java


public class SPImageProc {

    static {
        System.loadLibrary("SPImageProc"); // SPImageProc.dll
    }


    // Declare native method
    private native void saySPImageProc();



    public static void example() {


        // Allocate an instance and invoke the native method
        new SPImageProc().saySPImageProc();  
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...