Создать makefile для objective-c и gtk

#objective-c #gtk

#objective-c #gtk

Вопрос:

Я новичок в objective-c и makefiles, в настоящее время я пытаюсь получить objective-c и Gtk «hello world» для компиляции через make. Код make выглядит следующим образом

 # Suffixes

.SUFFIXES: .o .m
.m.o:
    $(CC) -c $(CFLAGS)

lt;

# Macros
CC = gcc
CFLAGS = -g
GTKFLAGS= `pkg-config --cflags --libs gtk -2.0`
LIBS = -lobjc
SRC = main.m MainWindow.m
OBJ = main.o MainWindow.o
PROG = gnulog514

# Explicit rule
all: hist

hist: $(OBJ)
$(CC) $(CFLAGS) -o main $(OBJ) $(GTKFLAGS) $(LIBS)

# Implicit rules
MainWindow.o: MainWindow.h MainWindow.m

и я получаю следующий вывод после make.

 gcc -c -g main.m
In file included from main.m:1:0:
MainWindow.h:1:20: fatal error: gtk/gtk.h: No such file or directory
compilation terminated.
make: *** [main.o] Error 1
 

Все остальное, что вам может понадобиться, просто спросите.

Обновить:

У меня есть кое-что еще, что может помочь при выполнении команды

 $ gcc `pkg-config --cflags --libs gtk 2.0` -lgnustep-base -fconstant-string-class=NSConstantString -o "./myprogram" $(find . -name '*.m') -I /usr/include/GNUstep/ -L /usr/lib/GNUstep/ -std=c99 -O3
 

(Получена ошибка от gtk 2.0 до gtk -2.0) Я получаю следующий вывод

 Package gtk 2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `gtk 2.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'gtk 2.0' found
In file included from ./main.m:1:0:
./MainWindow.h:1:20: fatal error: gtk/gtk.h: No such file or directory
compilation terminated.
In file included from ./MainWindow.m:1:0:
./MainWindow.h:1:20: fatal error: gtk/gtk.h: No such file or directory
compilation terminated.
 

Я исправлю это и вернусь сюда, чтобы обновлять этот вопрос до решения.

Комментарии:

1. Вероятно, есть что-то вроде #include "gtk/gtk.h" в верхней части MainWindow.h . Не могли бы вы показать нам эту строку и сказать, где на самом деле находится этот файл относительно вашего рабочего каталога?

2. Я отправил свою работу на github, вы тоже можете проверить там. Здесь у вас есть #импорт <gtk/gtk.h> #импорт <Foundation/NSObject.h> #импорт <Foundation/NSString.h> github.com/jmolinaso/GNUlog514

3. Но у вас нет /gtk/gtk.h в вашем рабочем каталоге, не так ли?

4. нет, у меня их нет в моем рабочем каталоге, но у меня есть библиотеки в системе.

5. thelinuxexperiment.com/guinea-pigs/tyler-b/…

Ответ №1:

Я заставил его работать. Короче говоря, вместо использования заголовков Foundation я использую заголовки objc.

Мой Makefile выглядит так

 # Suffixes
%.o : %.m
    $(CC) $(CCFLAGS) $(CCGTK) -c -o $@ $^

# Macros
CC = gcc
CCFLAGS = -lobjc
CCGTK = `pkg-config --cflags --libs gtk -2.0` 
SOURCES= $(wildcard *.m) 
OBJECTS= $(SOURCES:.m=.o)
PROG = glog514

# Targets
all: $(SOURCES) $(PROG)

$(PROG): $(OBJECTS)
    $(CC) -o $@ $(OBJECTS) $(CCFLAGS) $(CCGTK) 

clean:
    rm -f $(OBJECTS) $(PROG)
 

И если вы хотите попробовать самостоятельно мой main.m

 #import "MainWindow.h"

int main(int argc, char *argv[]) {

  //init gtk engine
  gtk_init(amp;argc, amp;argv);

  //set up GUI
  MainWindow *mainWindow = [[MainWindow alloc] initWithArgCount:amp;argc ArgVals:argv];

  //begin the GTK loop
  [mainWindow startGtkMainLoop];

  //free the GUI
  [mainWindow free];

  //exit application
  return 0;
}
 

мой MainWindow.h

 #include <objc/Object.h>
#include <gtk/gtk.h>

id myMainWindow;

@interface MainWindow:Object
{
  // Main GTKWindow
  GtkWidget *mainWindow;
  GtkWidget *button;
}

-(id)initWithArgCount:(int *)argc ArgVals:(char *[])argv;

-(void)destroyWidget;

-(void)startGtkMainLoop;

-(void)printSomething;

void on_MainWindow_destroy(GtkObject *object, gpointer user_data);

void on_btnPushMe_clicked(GtkObject *object, gpointer user_data);

@end
 

мой MainWindow.m

 #include "MainWindow.h"
#include <gtk/gtk.h>

@implementation MainWindow


-(id)initWithArgCount:(int *)argc ArgVals:(char *[])argv {
  //call parent class’ init
  if (self = [super init]) {
    //setup the window
    mainWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    gtk_window_set_title (GTK_WINDOW (mainWindow), "Hello World");
    gtk_window_set_default_size(GTK_WINDOW(mainWindow), 230, 150);

    //setup the button
    button = gtk_button_new_with_label ("Push me!");

    gtk_container_add (GTK_CONTAINER (mainWindow), button);

    //connect the signals
    g_signal_connect (mainWindow, "destroy", G_CALLBACK (on_MainWindow_destroy), NULL);
    g_signal_connect (button, "clicked", G_CALLBACK (on_btnPushMe_clicked), NULL);

    //force show all
    gtk_widget_show_all(mainWindow);
  }

  //assign C-compatible pointer
  myMainWindow = self;

  //return pointer to this object
  return self;
}

-(void)startGtkMainLoop {
  //start gtk loop
  gtk_main();
}

-(void)printSomething{

}

-(void)destroyWidget{
  myMainWindow = NULL;

  if(GTK_IS_WIDGET (button)){
    //clean up the button
    gtk_widget_destroy(button);
  }

  if(GTK_IS_WIDGET (mainWindow)){
    //clean up the main window
    gtk_widget_destroy(mainWindow);
  }
}

-(void)dealloc{
  [self destroyWidget];

  [super dealloc];
}

void on_MainWindow_destroy(GtkObject *object, gpointer user_data){
  //exit the main loop
  gtk_main_quit();
}

void on_btnPushMe_clicked(GtkObject *object, gpointer user_data){
  printf("Button was clickedn");

  //call Objective-C function from C function using global object pointer
  [myMainWindow printSomething];
}

@end
 

Просто поместите все файлы в одну папку и запустите make, вы получите скомпилированный файл с именем glog514, затем запустите его, и вы получите красивое окно gtk.

./glog514

приветствия,