La méthode habituelle consiste à utiliser un environnement de construction et des outils qui ont un assembleur ainsi qu'un compilateur C/C++. Les compilateurs (et les assembleurs) prennent les fichiers source et produisent un format de fichier d'objet intermédiaire. Sur Microsoft Windows, avec Microsoft Tools, il s'agirait de fichiers .obj. Un éditeur de liens est ensuite utilisé pour lier les fichiers .obj - qui étaient potentiellement produits par une grande variété de langages - fortran, cobol, C++, c, objectif-c, assemblage, etc., dans un seul binaire d'application.
Les fichiers objets sont essentiellement une collection de symboles exportés, étiquetant de petits blocs d'octets et des symboles non résolus, étiquetant des fragments d'octets qui doivent être corrigés pendant la liaison pour pointer vers quelque chose dans un fichier objet différent.Maintenant, le problème habituel - sur les plates-formes que j'ai vécues qui ne sont pas proches des vôtres, est, les compilateurs C++ ne sont pas faits avec aucune sorte de compatibilité binaire en langage croisé à l'esprit. C compilateurs, d'autre part, sont. Les compilateurs C++ fabriquent donc des symboles fortement altérés qui incorporent toutes sortes d'informations sur les types de paramètres et de retours dans les noms de symboles. Ce mécanisme est ce qui rend la surcharge de l'opérateur possible.
Quoi qu'il en soit, le point crucial est,
- Vous devez construire les fichiers asm. Si vous n'avez pas d'assembleur, vous avez de la chance. Et il doit probablement provenir du même fournisseur que votre jeu d'outils c/C++
- Vous devez indiquer à votre programme C++ les noms des symboles externes. D'une manière compatible avec c. C'est pour cela que les fichiers d'en-tête sont généralement utilisés.
donc créer un fichier d'en-tête pour maintenir les déclarations de fonction pour le code pid et placez quelque chose comme ça dans les:
extern "C" PidMain (void); Maintenant, # incluez ce fichier d'en-tête dans votre programme C++, et assurez-vous que les fichiers objets produits par l'assembleur sont inclus dans l'étape de liaison de votre environnement et que vous devriez être en or.
Il peut y avoir un type de convention d'appel impliqué. Certains environnements ont des normes différentes quant à l'ordre dans lequel les éléments sont placés sur la pile, et/ou qui est responsable du nettoyage de la pile. La plupart des jeux d'outils MS Windows prennent en charge au moins une convention d'appel __pascal et __cdecl, de sorte que la désincarnation ressemble à
extern "C" void __pascal PidMain (void);
Je n'ai aucune connaissance spécifique s'il existe plusieurs conventions d'appel dans votre environnement spécifique. Donc, je ne sais pas à quel point cela a été utile. Bonne chance je suppose.
Pour C++, il aura aussi besoin de 'extern 'C" 'sur les déclarations de fonction. –
@Pavel: merci, ajouté. –
Et comme indiqué dans l'autre réponse lier les fichiers obj ensemble. – simon