Salut les C,
comme le dit le titre je suis en train de construire un programme et j'ai opter pour approche de type MVC (Model View Controller).
C.a.d que j'ai décider de scinder le code en 3 parties bien distinctes:
1. La partie traitement des données du programme (Model).
2. La partie concernant le code de l'interface graphique (View).
3. La partie faisant la liaison entre les deux (Controller).
Les 3 parties étant complètement séparées.
Et j'ai bien sur un problème, mais ce n'est pas directement lié a l'approche MVC mais d'un tout autre ordre.
Voila maintenant que le travail est fait j'aimerai compiler le code Model sous forme de library statique.
Le problème est que je ne suis pas certains du tout, après expérience, de vraiment savoir ce qu'est une library statique, comment parvenir a la compiler correctement et surtout comment l'intégrer dans mon programme.
Car je pensais que une library statique (qui est un fichier de type archive ar dans mon cas (Linux)) pouvait simplement se passer au compilateur comme un fichier objet (*.o) mais cela ne fonctionne pas malheureusement .
J'arrive a compiler mes sources sous forme de library statique avec le code suivant:
Admettons les fichiers suivant.
Fichier libmyprog.hpp:
Fichier libmyprog.cpp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #ifndef LIB_MY_PROG_HH #define LIB_MY_PROG_HH #include <cstdio> void print_it() ; #endif
Fichier main.cpp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #include "libmyprog.hpp" void print_it() { fprintf(stdout,"It Works\n") ; }
Fichier Makefile:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #include "libmyprog.hpp" int main(int argc, char *argv[]) { print_it() ; return 0 ; }
NB:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 LIB_SOURCE_FILE = libmyprog.cpp LIB_OUTPUT_FILE_O = libmyprog.o LIB_OUTPUT_FILE_A = libmyprog.a PRG_SOURCE_FILE = main.cpp CXX = g++ CXXFLAGS_OBJ = -std=c++11 -c CXXFLAGS_PRG = -std=c++11 -o my_prog obj: $(CXX) $(CXXFLAGS_OBJ) $(LIB_SOURCE_FILE) static: ar rcs $(LIB_OUTPUT_FILE_A) $(LIB_OUTPUT_FILE_O) ranlib $(LIB_OUTPUT_FILE_A) exec: $(CXX) $(CXXFLAGS_PRG) $(LIB_OUTPUT_FILE_A) $(PRG_SOURCE_FILE) clean: rm *.a rm *.o
Si vous pensez que je ne suis pas dans le bon forum: code C++.
Je l'ai fait exprès espérant trouver plus d'aide sur le sujet d'utilisation d'une library statique (Linux) auprès de la communauté C du forum
malgré que j'aurai bien poster dans les deux forums a la fois.
Bon c'est facile, il suffit d'entrer les commandes suivantes:
Pour voir le plantage...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 $ make obj g++ -std=c++11 -c libmyprog.cpp $ make static ar rcs libmyprog.a libmyprog.o ranlib libmyprog.a $ make exec g++ -std=c++11 -o my_prog libmyprog.a main.cpp /tmp/ccfflfod.o: dans la fonction « main »: main.cpp:(.text+0x10): référence indéfinie vers « print_it() » collect2: error: ld returned 1 exit status make: *** [exec] Erreur 1
Alors c'est donc une erreur de linking et c'est dû au fait que je désire utilisé une library statique pensant bêtement la passer en ligne de commande au compilateur comme ont passe un fichier objet.
Soit dit en passant que si je remplace $(LIB_OUTPUT_FILE_A) par $(LIB_OUTPUT_FILE_O) le programme se compile sans problème.
ajoutons,
a notre Makefile.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 exec2: $(CXX) $(CXXFLAGS_PRG) $(LIB_OUTPUT_FILE_O) $(PRG_SOURCE_FILE)
Et tapons les commandes:
Je ne sais pourquoi j'ai pris un fichier archive ar (libmyprog.a: current ar archive) pour un fichier objet et pourquoi il faudrait linker une archive...???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4$ make exec2 g++ -std=c++11 -o my_prog libmyprog.o main.cpp $ ./my_prog It Works
Mais je suis tout ouïe de vos réponses, et j'aimerai beaucoup entendre vos explications sur le sujet de mon plantage de programme.
Merci pour vos réponses éclairées illuminant les ténèbres de mon ignorance.
Sur ce bon code C (ou C++) a vous et bon week-end.
Partager