Si j'ai bien compris le machin en lisant rapidement en diagonale vos références, c'est un peu fermé comme architecture.
(remarque :
set path=%path%;C:\PDFium\depot_tools
à en croire la doc, il vaut mieux le faire dans l'autre sens.
set path=C:\PDFium\depot_tools;%path%
)
Si vous n'êtes pas un développeur C++, il y a peut-être des trucs qui vous semble étranges et qui vous conduise à faire des trucs "impossibles".
Alors, on va commencer par des trucs "évident" pour un développeur C++, mais c'est toujours important de revoir les bases.
Visual Studio n'est pas une chaine de compilation C++, mais un IDE gérant un grand nombre de langage via des modules.
Jusqu'à récemment, le seul "module" de compilation C++ s'intégrant complètement à VS était MSVC.
Depuis peu, les outils de la chaine de compilation Clang sont supportés "partiellement".
Mais rien n'empêche d'utiliser une chaine de compilation autre depuis VS mais l'intégration dans l'IHM est beaucoup moins poussée. Il faut faire des trucs à la main.
Comme par exemple quand vous utiliser NMAKE, très proche du MAKE d'Unix, les modifications dans les "sources" du système de build sont à votre charge.
En gros, avec NMAKE, on peut juste demander une compilation(génération de l'exécutable), un nettoyage des fichiers générés, démarrer une session de debugging, et utiliser l'éditeur de texte de VS, point barre.
Vous ajoutez un cpp au projet => vous devez éditer vous-même les fichiers utilisés par NMAKE.
Ninja, c'est un peu comme l'utilisation de NMAKE.
Sauf que pas mal de personnes ont créez des outils pour pallier aux limitations de ce type de "non intégration" à VS.
Mais il reste que la chaine de compilation n'est pas vraiment gérée par VS mais par les fichiers de paramétrage du système de build Ninja.
VS, comme dans le cas NMAKE ne peut demander que très peu de chose différente à la chaine de compilation que Ninja à configuré.
La chaine de compilation utilisée par ninja n'est pas explicitement donnée dans la documentation (ou j'ai lu trop vite), mais si c'était MSVC, on aurait pas tous ces outils ad hoc à installer dans VS pour gérer les fichiers "Ninja".
En C++, la chaine de compilation a une grande importance car tous les fichiers intermédiaires entre le code sources que vous tapez dans un éditeur et le module exécutable générés (code assembleur, fichier objet, fichier librairie/archive, ...) ne sont pas standardisés.
Comme ils ne sont pas standardisés, il est très compliqué (voir impossible) de prendre l'un généré par une chaine de compilation et l'utiliser ensuite dans une autre, et les fichiers .lib/.a sont des fichiers intermédiaire.
Le code source C++ devrait suivre le standard C++ (qui évolue tous les 3 ans actuellement) mais il est assez répandu d'avoir des codes sources C++ dit "non portable" qui ne sont compilable par n'importe quel compilateur C++ "standard".
Il n'est pas exclure que les sources que vous cherchiez à compiler ait des parties "non portable". Ce qui expliquerait l'usage d'outils "exotiques" et pas des trucs plus standard comme CMake.
Le format du fichier .dll est imposé par l'OS et est le même quelque soit le langage du code source, donc quelque soit la chaine de compilation.
Ce qui fait que pour de l’interfaçage entre modules, on part plutôt d'un extracteur d'informations depuis le .dll que depuis un .lib.
Si vous ne faites pas de réglage particulier dans VS et que vous partez bille en tête, vous vous retrouvez avec un projet C++ qui prend comme chaine de compilation MSVC, qui sera donc incapable d'utiliser des .lib/.a issue d'autres chaines de compilation.
Il y a une petite particularité pour les lib issues de MSCV, c'est que les .lib fournis par M$ pour pouvoir attaquer les API de l'OS sont construites avec MSVC, toutes les autres chaines de compilation qui doivent pouvoir générer des exécutable qui attaquent, directement ou indirectement, les API de l'OS doivent pouvoir lire ou convertir ces .lib MSVC vers leur format de .lib.
Sachant les détails que je viens d'exposer, je ne suis pas sûr que vouloir faire une Dll à partir de MSVC, en utilisant des .lib générées par une chaine de compilation inconnue pilotée par des fichiers de configuration de Ninja, soit la solution la plus simple et la plus directe.
Généralement, pour ne pas se compliquer la vie, soit on modifie les sources du projet initial, sans changer de chaine de compilation, soit on joue, si la conception de l'API de la Dll le permet, la stratégie des poupées russes : la nouvelle Dll appelle les fonctions de la Dll "de base". Pour la stratégie à la poupée russe, il suffit d'avoir un outil qui génère un .lib au format de la chaine de compilation à partir de la Dll.
Il existe aussi la méthode de tout recompiler avec la nouvelle chaine de compilation mais cela vous expose aux problèmes de "non portabilité" possibles. Et que je pense très probable vu la nature un peu exotique des outils.
Partager