#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. нет, у меня их нет в моем рабочем каталоге, но у меня есть библиотеки в системе.
Ответ №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
приветствия,