Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Bibliothèque statique C/C++

3 réponses
Avatar
Guillaume GOURDIN
Bonjour à tous,

est-il possible d'ajouter des *.o compilé en C et d'autres en C++ dans
un seul fichier de bibliothèque? Quels précuation s faut-il prendre? Je
sais déjà qu'il faut ajouter 'extern "C"'.

Merci poru votre aide.

3 réponses

Avatar
Frederic Lachasse
On Aug 22, 11:24 am, Guillaume GOURDIN wrote:
Bonjour à tous,

est-il possible d'ajouter des *.o compilé en C et d'autres en C++ dans
un seul fichier de bibliothèque? Quels précuation s faut-il prendre? Je
sais déjà qu'il faut ajouter 'extern "C"'.



En principe, aucun problème avec cela. On peut aussi ajouter des .o
fabriqué à partir d'autres langage, assembleur ou Fortran par exemple.
Cependant, il peut y avoir des difficultés dues à des incompatibilité s
de formats des .o, par exemple si on mélanges des .o 32 bits avec
des .o 64 bits. Comme on ne peut pas inclure du code 32 bits et 64
bits dans un même exécutable, l'utilitaire "ar" (pour créer les
librairies .a sous Unix/Linux) souvent refuse de mélanger les 2 types
de modules objets.

Après cela, le fait que ces modules .o dans la librarie généré vont
marcher dans le même exécutable est un autre problème. Si les
programme C et C++ sont compilés par le même compilateur (en fait, les
compilateurs C++ sont toujours accompagnés par un compilateur C qui
leur est compatible), pas de problème.
Avatar
James Kanze
On Aug 22, 5:24 pm, Guillaume GOURDIN wrote:

est-il possible d'ajouter des *.o compilé en C et d'autres en
C++ dans un seul fichier de bibliothèque?



En principe, ça dépend du compilateur/bibliothèquaire. Mais dans
la pratique, à partir du moment qu'on a un fichier de format
objet, son provenence n'a plus d'importance. (Puisque tu parles
des *.o, je supposerais Unix. Dans tel cas, tu peux ajouter
littéralement tout dans un bibliothèque -- non seulement des
objets, mais aussi des sources, de la documentation...)

S'en servir une fois que c'est dans la bibliothèque, c'est une
autre question. En règle générale, s'il y a du C++, il faut que
le main soit en C++. Sinon, tout ce qui sert d'interface entre
les modules C et les modules C++ doit être déclaré « extern
"C" » dans le C++.

Quels précuation s faut-il prendre? Je sais déjà qu'il faut
ajouter 'extern "C"'.



C'est la principale. Au moins en principe (et souvent en fait),
il faut aussi que le main soit écrit en C++, et que le programme
final soit linké comme du C++ (avec g++ plutôt que gcc, par
exemple). Aussi, que tout le C++ soit compilé avec la même
version du même compilateur, et avec les mêmes options. Ce qui
est une simplification, évidemment -- prèsque tous les
compilateurs garantissent la compatibilité binaire entre
certaines versions, et évidemment, certaines options n'y jouent
pas non plus. Mais pour les détails, il faut bien voir la
documentation du compilateur.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Avatar
James Kanze
On Aug 23, 11:26 pm, Frederic Lachasse
wrote:
On Aug 22, 11:24 am, Guillaume GOURDIN wrote:
> est-il possible d'ajouter des *.o compilé en C et d'autres
> en C++ dans un seul fichier de bibliothèque? Quels
> précuation s faut-il prendre? Je sais déjà qu'il faut
> ajouter 'extern "C"'.



En principe, aucun problème avec cela. On peut aussi ajouter des .o
fabriqué à partir d'autres langage, assembleur ou Fortran par exemple .
Cependant, il peut y avoir des difficultés dues à des incompatibilit és
de formats des .o, par exemple si on mélanges des .o 32 bits avec
des .o 64 bits. Comme on ne peut pas inclure du code 32 bits et 64
bits dans un même exécutable, l'utilitaire "ar" (pour créer les
librairies .a sous Unix/Linux) souvent refuse de mélanger les 2 types
de modules objets.



Pas sous Unix. Un fichier d'« archive » peut contenir n'importe
quoi. Tout ce qui est dit est que « When an archive consists
entirely of valid object files, the implementation shall format
the archive so that it is usable as a library for link editing
(see c99 and fort77). When some of the archived files are not
valid object files, the suitability of the archive for library
use is undefined. » Unix (Open Group) exige en plus que « f an
archive consists entirely of printable files, the entire archive
shall be printable », ainsi que la création automatique de
l'« index » si un fichier objet est présent (et donc, qu'on n'a
pas besoin de « ranlib »).

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34