Application Cocoa construite avec un makefile qui n'affiche pas son menu
Le
Guilhem de Wailly
Je suis tout nouveau dans la programmation macosx. Je cherche a
construire une application "hello world" avec un makefile.
Elle se compile correctement ; à l'execussion, elle affiche sa
fenêtre, mais pas son menu ; elle n'aparait pas non plus dans le
dock.
Merci par avance de toute idée
Guilhem de Wailly
Voila les sources:
# makefile
all: main
main.o: main.m
gcc -Wall -c -g -o $@ $^
main: main.o
gcc -g -o $@ $^ -framework cocoa
/* main.m */
#include <Cocoa/Cocoa.h>
@class NSWindow;
@class NSTextField;
@class NSNotification;
@interface AppController : NSObject {
NSWindow * window;
NSTextField * label;
}
- (void)applicationWillFinishLaunching:(NSNotification *) not;
- (void)applicationDidFinishLaunching:(NSNotification *) not;
@end
@implementation AppController
- (void) applicationWillFinishLaunching: (NSNotification *) not {
/* Create Menu */
NSMenu * menu;
NSMenu * info;
NSLog (@"Creating the menu");
menu = [NSMenu new];
[menu addItemWithTitle: @"Info"
action: NULL
keyEquivalent: @""];
[menu addItemWithTitle: @"Hide"
action: @selector(hide:)
keyEquivalent: @"h"];
[menu addItemWithTitle: @"Quit"
action: @selector(terminate:)
keyEquivalent: @"q"];
info = [NSMenu new];
[info addItemWithTitle: @"Info Panel"
action: @selector(orderFrontStandardInfoPanel:)
keyEquivalent: @""];
[info addItemWithTitle: @"Preferences"
action: NULL
keyEquivalent: @""];
[info addItemWithTitle: @"Help"
action: @selector (orderFrontHelpPanel:)
keyEquivalent: @"?"];
[menu setSubmenu: info
forItem: [menu itemWithTitle: @"Info"]];
[info release];
[NSApp setMainMenu:menu];
[menu release];
/* Create Window */
window = [[NSWindow alloc]
initWithContentRect: NSMakeRect(300, 300, 200, 100)
styleMask: (NSTitledWindowMask |
NSMiniaturizableWindowMask |
NSResizableWindowMask)
backing: NSBackingStoreBuffered
defer: YES];
[window showsResizeIndicator];
[window setAlphaValue: 0.9];
[window setTitle: @"Hello World"];
/* Create Label */
label = [[NSTextField alloc] initWithFrame: NSMakeRect(30, 30, 80, 30)];
[label setSelectable: NO];
[label setBezeled: NO];
[label setDrawsBackground: NO];
[label setStringValue: @"Hello World"];
[[window contentView] addSubview: label];
[label release];
}
- (void) applicationDidFinishLaunching: (NSNotification *) not {
[window makeKeyAndOrderFront: self];
}
- (void) dealloc {
[window release];
[super dealloc];
}
@end
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool;
AppController * delegate;
NSLog (@"Creation");
pool = [NSAutoreleasePool new];
delegate = [AppController new];
[NSApplication sharedApplication];
[NSApp setDelegate: delegate];
[pool release];
NSLog (@"Running");
[NSApp run];
return 0;
}
construire une application "hello world" avec un makefile.
Elle se compile correctement ; à l'execussion, elle affiche sa
fenêtre, mais pas son menu ; elle n'aparait pas non plus dans le
dock.
Merci par avance de toute idée
Guilhem de Wailly
Voila les sources:
# makefile
all: main
main.o: main.m
gcc -Wall -c -g -o $@ $^
main: main.o
gcc -g -o $@ $^ -framework cocoa
/* main.m */
#include <Cocoa/Cocoa.h>
@class NSWindow;
@class NSTextField;
@class NSNotification;
@interface AppController : NSObject {
NSWindow * window;
NSTextField * label;
}
- (void)applicationWillFinishLaunching:(NSNotification *) not;
- (void)applicationDidFinishLaunching:(NSNotification *) not;
@end
@implementation AppController
- (void) applicationWillFinishLaunching: (NSNotification *) not {
/* Create Menu */
NSMenu * menu;
NSMenu * info;
NSLog (@"Creating the menu");
menu = [NSMenu new];
[menu addItemWithTitle: @"Info"
action: NULL
keyEquivalent: @""];
[menu addItemWithTitle: @"Hide"
action: @selector(hide:)
keyEquivalent: @"h"];
[menu addItemWithTitle: @"Quit"
action: @selector(terminate:)
keyEquivalent: @"q"];
info = [NSMenu new];
[info addItemWithTitle: @"Info Panel"
action: @selector(orderFrontStandardInfoPanel:)
keyEquivalent: @""];
[info addItemWithTitle: @"Preferences"
action: NULL
keyEquivalent: @""];
[info addItemWithTitle: @"Help"
action: @selector (orderFrontHelpPanel:)
keyEquivalent: @"?"];
[menu setSubmenu: info
forItem: [menu itemWithTitle: @"Info"]];
[info release];
[NSApp setMainMenu:menu];
[menu release];
/* Create Window */
window = [[NSWindow alloc]
initWithContentRect: NSMakeRect(300, 300, 200, 100)
styleMask: (NSTitledWindowMask |
NSMiniaturizableWindowMask |
NSResizableWindowMask)
backing: NSBackingStoreBuffered
defer: YES];
[window showsResizeIndicator];
[window setAlphaValue: 0.9];
[window setTitle: @"Hello World"];
/* Create Label */
label = [[NSTextField alloc] initWithFrame: NSMakeRect(30, 30, 80, 30)];
[label setSelectable: NO];
[label setBezeled: NO];
[label setDrawsBackground: NO];
[label setStringValue: @"Hello World"];
[[window contentView] addSubview: label];
[label release];
}
- (void) applicationDidFinishLaunching: (NSNotification *) not {
[window makeKeyAndOrderFront: self];
}
- (void) dealloc {
[window release];
[super dealloc];
}
@end
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool;
AppController * delegate;
NSLog (@"Creation");
pool = [NSAutoreleasePool new];
delegate = [AppController new];
[NSApplication sharedApplication];
[NSApp setDelegate: delegate];
[pool release];
NSLog (@"Running");
[NSApp run];
return 0;
}

Poser une question


Si tu programmes en Cocoa, je te conseille d'utiliser XCode, fournit
gratuitement avec les outils de développement d'Apple. C'est autrement
plus simple de créer un projet avec que par l'intermédiaire de fichier
makefile.
Tu remarqueras par exemple qu'il est possible de faire une application
avec un menu et une fenêtre contenant "Hello word", sans crire une seule
ligne de code!!!
Le tutorial:
ndex.html#//apple_ref/doc/uid/TP40000863>
Pour commencer:
x.html>
La doc officielle, très facile à lire quand on se plonge dedans.
<Pour commencer:
--
Schmurtz
une application existante windows/linux sous macosx.
L'application comporte une centaine de modules qui peuvent etre
compilés / liées en mode static ou dynamique (dll), avec un
mode debug et release...
j'ai commis un generateur de makefile en M4 qui me permes d'avoir
dans le makefile.template, une ligne par module, le processeur
m4 générant toutes les dépendences et les centaines de lignes
de makefile... Bref, un vrai bouzin bien pratique.
c'est pourquoi il me faut de (grande) préférence acuérire les
moyens d'utiliser les makefiles... J'ai vu xcode, c'est top,
mais si je dois créer 4 targets par modules, je ne suis pas
encode sorti du bois!
sais tu s'il existe un lieu ou je puis trouver des exemples
de code cocoa avec makefile? J'ai passé un temps dajà considérable
pour essayer de trouver mon bonheur, sans sucès...
merci
Guilhem
Schmurtz wrote:
Ah oui, ça change un peu la donne.
Non, tu peux aussi créer 1 seul targets par modules et créer des
variantes de compilations indépendante des targets et utilisable pour
tous les targets.
Comme c'est un peu complexe à mettre en ¦uvre sur un projet déjà
existant, je te conseille plutôt de rester avec les makefiles. Par
ailleurs tu peux créer une cible qui se contente de lancer un makefile.
Compiler une application Cocoa avec un makefile n'est pas compliqué en
soit. Le seul endroit où tu pourras avoir des problèmes, c'est dans la
manière de lié à un framework :
gcc -framework Cocoa -o appli source.m
C'est expliqué ici :
Par ailleurs il peut-être utile de créer l'interface graphique avec
Interface Builder, et ainsi la stocker dans un fichier nib. Je ne sais
pas comment est origanisé ton application, mais j'ai vu un peu comment
c'était fait dans VLC qui est open source (http://www.videolan.org/). Il
utilise en fait un plugin qui gère l'interface graphique et qui charge
lui même ses fichiers nib. Tout le reste du code est strictement
identique.
Au moment de la création de la l'application, tu dois obtenir la
hiérarchie suivante :
appli.app
Contents
Info.plist <-- voir comment son fait ceux des autres applis
MacOS
appli <-- l'exécutable à lancer
Resources
...
Tous les autres fichiers peuvent être mis où c'est le plus pratique,
même dans Contents/MacOS si tu veux. L'idéal serait tout de même de
suivre autant que possible les guidelines d'Apple :
Contents/Resources : les données utilisé par l'application
(l'équivalent de /usr/share/ sous linux)
Contents/Resources/ langue
Contents/Plugins/ : les plugins
Contents/Frameworks/ : les bibliothèques partages qui ne sont pas des
plugins (l'quivalent de /usr/lib/ sous linux)
Pour info, la structure de l'application VLC est la suivante :
VLC.app
Contents
Info.plist
MacOS
VLC
lib
...
locale
fr
...
en
...
modules
...
share
...
Resources
English.lproj
MainMenu.nib
French.lproj
MainMenu.nib
--
Schmurtz
Si tu veux tout faire à la main, compiler un simple executable est
insuffisant.
"An application is a bundle":
ew/AppPackaging/chapter_5_section_2.html>
Tout sur les bundles:
ew/Bundles/chapter_4_section_1.html#//apple_ref/doc/uid/20000982/CHDDDIF
F>
--
Luc Heinrich -
succès...
Dans la méthode
- (void) applicationDidFinishLaunching: (NSNotification *) not {
NSLog (@"Finishing to launch. Can be Main = %s",
[window canBecomeMainWindow] == true ? "yes" : "no");
[window makeKeyAndOrderFront:nil];
[window makeMainWindow];
}
le message de log indique que la fenêtre 'window' ne peut pas être
main... Reste a savoir pourquoi!!!