libC MWRKS MPW SUN et OsX

iManu

Membre actif
23 Février 2001
633
19
Toulouse
Salut,

Bon je vais essayer de pas m'emmeller les pinceaux lors de la description du pb.
grin.gif


Je dois porter un code de calcul, écrit en C, d'une station Sun vers Mac Os X. Ce code a déja été porté sur Mac (par un étudiant à moi) mais sous Os 9, environnement MPW (via Absoft).
Le build est réalisé par un script (.make) qui permet de définir les architectures. Sont donc définies les architectures GEN_UNIX (unix générique), MPW, MWRKS, et autres.
Ceci sert essentiellement à appeler des fichiers .h différents lors de la compilation (il y a aussi d'autres trucs style définitions, mais je crois que ça je peux me débrouiller).

Question:
Vaut-il mieux que je parte sur l'architecture MPW ou MWRKS (après tous, ça tourne déja sur un mac), ou GEN_UNIX (c'est un système unix) ?

Dans tous les cas la compil foire pour cause de libraries et .h inconnus, mais comme je ne sais pas où sont les .h sur Os X, je ne sais pas lesquels je suis succeptible de retrouver le plus facilement.
Je ne sais pas où regarder dans la doc, ni même si c'est mentionné quelque part...

Voila, je ne sais pas si je suis clair, mais je suis un peu coincé...
confused.gif


Ah oui, autre question, j'utilise la commande make -f file.make, sur terminal, parceque je ne sais pas comment faire avec PB pour faire prendre en compte le fichier file.make (qui est assez complexe, il y a ++ de fichiers, et je voudrais pouvoir le ré-utiliser).
La aussi, une idée quelqu'un ?

Merci
smile.gif
 
Ca dépend en fait de ton programme.

S'il tourne sous x-windows sur les stations sun, il vaut mieux que tu partes de la version Mac que tu pourras carboniser. Ca sera + facile que de transposer x-windows en os 9 ou cocoa.

Si c'est un exécutable que tu lances par la console et qui utilise les flux standard (stdout, stdin, stderr), alors part de la version sun. Le portage sous os x se fera bcp + facilement.

Concernant les .h et les librairies, tout dépend de ce dont tu as besoin. Les headers standards se trouvent dans /usr/include et ses sous-répertoires. La  entre les unix se trouve soit dans la localisation des headers (répertoires sys, device etc...) soit dans le contenu des headers eux-meme (plus embetant, mais avec un grep sur les définitions qui sortent en erreur, tu peux t'en sortir).

Quasiment tous les headers standards se trouvent au meme endroit avec le meme contenu d'un unix à un autre (base systemV ou BSD). OS X ne déroge pas à la règle.

Les librairies se trouvent dans /usr/lib. Il se peut qu'elles soient indiquées dans le Makefile par leur nom SANS le préfixe "lib" ("-lm -lc" pour respectivement libm et libc...)

(Concernant les lib et les headers, je ne parle pas ici de la version x-windows dont les .h et libxxx se trouvent dans des repertoires spécifiques).

Pour les fichiers make sous PB, je n'ai pas creusé la question
smile.gif
 
Je suis d'accord : truc aussi pratique les frameworks. Pour les outils standard unix le framework Kernel dans /System/Library/Frameworks est celui qui convient il contient tous les headers "de base".

Si l'appli utilise XFree, ben les headers XFree sont disponibles dans /usr/X11R6/include et les libs aussi ... après installation de XFree ...

Pour les make et PB ... ben PB n utilise pas les make ... Il faut regarder sur la Darwin development mailling list, je jetterais un coup d'oeil.
http://lists.apple.com y a pas de moteurs pour y faire un recherche
 
Merci à vous 2.

Je vais essayer de me debrouiller avec ça.
L'application tourne sans X-Window, c'est juste une appli sur le terminal.

Par contre, le code est prévu pour différent types de machines, avec des options différentes qui semblent liées au hardware. Je vais dans un premier temps recenser les différences. J'ai un peu de mal à voir ce qui dépend du hard et du soft. Ceci dit, je pars sur la piste des options 'Gen_unix' et on verra.

En ce qui concerne le makefile c'est un peu optionnel puisque ça semble marcher sans passer par PB, c'est simplement un peu frustrant, car ça serait plus élégant de l'utiliser... et sans doute plus formateur pour moi dans l'optique de faire de VRAIS programmes Mac.

Encore merci - et sans doute à bientôt
grin.gif
 
OK, je pars sur le build 'GEN_UNIX', qui semble plus simple.
Je regarde dans /usr/include et je retrouve les fichiers .h dont j'ai besoin, SAUF UN:
values.h

Ce fichier ne semble pas sur le mac. Il existe sur la station SUN, et contient des trucs peu compréhensibles pour moi, et renvoie à d'autres fichiers .h sur la SUN.

Une idée sur le rôle de ce fichier?
Il revient dans pas mal de sous-programmes, et toujours dans le cas d'un programme 'GEN_UNIX' donc ça devrait être standard... non ?
 
Je ne sais pas du tout a quoi ca correspond, le fichier value.h, mais si tu ne le trouves vraiment pas, c'est la ou commence le portage.
Tu mets le #include <value.h> en commentaire, et tu essayes de compiler. La plupart des erreurs de compilation que tu vas trouver seront du a l'absence de ce fichier. Maintenant, a toi de trouver des equivalents aux fonctions manquantes. N'hesite pas a redemander si t'as un probleme.
 
Bon, ça va un peu mieux... ça progresse
smile.gif


values.h est une librairie obsolète qui peut être remplacée par limits.h selon la liste apple PB-users:
<BLOCKQUOTE><font size="1" face="Verdana, Geneva">quote:</font><HR> A comment found in values.h on my Linux box is:

/* This interface is obsolete. New programs should use
&lt;limits.h&gt; and/or &lt;float.h&gt; instead of &lt;values.h&gt;. */ <HR></BLOCKQUOTE>

Ca compile, reste à linker, et là ça plante...
Je gratte un peu...

Merci à tous
 
Bon, j'y vois (un peu) plus clair, et je repars à zéro après téléchargement du source original...

En fait, j'ai réussi à compiler, linker et lancer le code que j'avais, mais ça plante à l'exécution, probablement parceque j'ai mal choisi les librairies et includes...
Comme ma version avait transité sur un Mac (compilé par un étudiant avec un 'mix' empirique de MPW et Code Warrior), il devait y avoir des scories...
grin.gif


En fait, j'apprends le C en même temps, et c'est pas simple de commencer avec un code de plusieurs dizaines de milliers de lignes...
confused.gif


Tout le problème, si je comprends bien est de trouver les librairies équivalentes sur les deux architectures (Sun et Mac Os). Pour OsX, ça se complique par le fait que des librairies de compatibilité avec Os9 cohabitent avec les librairies purement unix d'OsX.

Je vais définir OsX comme une architecture, et modifier les #include en fonction de la demande...

petit trucs en vrac :
-Au link, l'option -lm veut dire de linker avec la librairie libm.a, c'est bien ça? parceque je ne la vois nulle part...

-Y a t'il un tutorial ou une doc sur l'emplacement des librairies et headers sur OsX?

-Et enfin, quelle est la commande grep qui permet de chercher une occurence dans un fichier (inconnu) de l'arborescence ?
En gros je veux trouver quel fichier contient la définition de TOTO dans /usr/include...

Bref, s'il y a un guide 'le portage for dummies', je suis preneur
grin.gif

S'il y a un chapitre intitulé 'pour Manu, sur l'art de passer de Sun à OsX', c'est encore mieux
wink.gif
 
<BLOCKQUOTE><font size="1" face="Verdana, Geneva">quote:</font><HR> En fait, j'apprends le C en même temps, et c'est pas simple de commencer avec un code de plusieurs dizaines de milliers de lignes... <HR></BLOCKQUOTE>

C'est pas ce que tu fais de mieux, en effet
smile.gif
. Tu devrais peut etre plutot commencer par un truc simple, parce que là tu risque de te noyer rapidement...

<BLOCKQUOTE><font size="1" face="Verdana, Geneva">quote:</font><HR> -Au link, l'option -lm veut dire de linker avec la librairie libm.a, c'est bien ça? parceque je ne la vois nulle part...
<HR></BLOCKQUOTE>

C'est bien ca. Elle se trouve dans /usr/lib/libm.dylib.

<BLOCKQUOTE><font size="1" face="Verdana, Geneva">quote:</font><HR> -Y a t'il un tutorial ou une doc sur l'emplacement des librairies et headers sur OsX?
<HR></BLOCKQUOTE>

Aucune idée... Quand je veux chercher kk chose, j'utilise 'man'. Ca m'a toujours suffit...

<BLOCKQUOTE><font size="1" face="Verdana, Geneva">quote:</font><HR> -Et enfin, quelle est la commande grep qui permet de chercher une occurence dans un fichier (inconnu) de l'arborescence ?
En gros je veux trouver quel fichier contient la définition de TOTO dans /usr/include...
<HR></BLOCKQUOTE>

ben tu te mets dans /usr/include (par cd), et tu tapes :

grep TOTO *.h

mais je te conseille la chose suivante :
dans usr/include, tu as plein de sous-repertoires. Si tu ne trouves pas ce que tu cherches, essaye :

find /usr/include -name "*.h" -exec grep -H TOTO {} \;

Ca te recherche (find) dans usr/include les fichiers se terminant par .h (-name "*.h") et lorsqu'il en trouve un, il exécute dessus un grep de TOTO en affichant le nom du fichier si TOTO se trouve dedans (- exec ......).

Le {} zarbi correspond à un code représentant le nom du fichier trouvé par find.

Le \; évite que le shell interprète ton ';' comme la fin de la commande 'find', alors que ca doit etre la fin de la commande 'grep'.

voila voila.
bon courage :-)
 
Merci Nexxen pour ces infos, ça va me servir.

Dernière précision:
Si la librairie est libm.dylib, si je mets l'option -lm, ça va la trouver quand même ?

Sur la plage ? Au soleil ?
Pas vers chez moi en tout cas !

A +

Manu
 
Bon, toujours le même truc.

J'ai éliminé (commenté) les appels à des headers qui ne se trouvaient pas directement dans /usr/include:
values.h (semble obsolète, cf plus haut)
fp.h
Je voulais savoir ce qui allait 'manquer' à la compilation, comme indiqué plus haut par SuperCed, or:

Je n'ai plus d'erreur à la compilation!
(ça me semble un peu curieux, surtout pour fp.h)

Par contre, au link (-lm), j'ai ce message:
/usr/bin/ld: Undefined symbols:
_free_vector
_vector
make: *** [/Users/manu/Projects/sim/bin/simset] Erreur 1

Je ne sais pas ce que ça veut dire, et ce que ça implique...
Est-ce que quelqu'un a une idée ?
 
Entre les shells et les linkers, t'as pas de bol...
grin.gif


Donc :

_free_vector
_vector

Une erreur comme ca qui vient du linker, ca veut dire que les prototypes des fonctions ("free_vector" et "vector") ont bien été trouvés, sinon ca planterait à la compil, mais que le code des fonctions, lui, ne l'a pas été (trouvé) par le linker.

Ca veut donc dire qu'il te manque une lib. Seulement là, elle ne me disent rien, ces fonctions. Je les ai cherchées chez moi, et elles sont introuvables. Il est fort probable que ce soit des fonctions "maisons"...

La seule facon de le savoir, c'est de chercher ces 2 fonctions dans tes sources. En tout cas, le compilo trouve bien une définition puisqu'il ne gueule pas....

Ou alors, regarde sur sun si tu les trouves, et dans quel header... Mais à vue de nez, ca ne ressemble pas à des fonctions systèmes... Mais bon, je peux me tromper.

bye
Nexx.
 
Suite de mes aventures passionantes
grin.gif


Si je linke avec l'option -undefined warning, ça me permet de générer mon exécutable, et ça tourne...
Entendons nous: sur un truc compliqué comme ça, je n'ai pas encore vérifié que tout va bien, ça sera le boulôt des jours prochains...

Autre truc: si je linke avec l'option -r, je n'ai plus de warning et ça tourne aussi... curieux...
free_vector et vector sont bien dans mon code, mais je n'ai pas vu ce qu'elles avaient de spécial (par rapport à ivector, ou autres qui ne posent pas problème...).

Dernier point, un truc bizarre:
L'exécutable doit être dupliqué et son nom modifié pour fonctionner (c'est comme ça...).
Si je fais la duplication via le finder (pomme-D), le fichier produit ne tourne pas. Il n'a pas la même taille que l'original.
Par contre, si je fais un cp via le terminal, ça marche bien...

Bon, fin du chapitre pour l'instant...
Merci, merci, MERCI à tous
smile.gif