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:
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 libmyprog.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 main.cpp:
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 ;
 
}
Fichier Makefile:
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
NB:
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:
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
Pour voir le plantage...

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,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
exec2:
	$(CXX) $(CXXFLAGS_PRG) $(LIB_OUTPUT_FILE_O) $(PRG_SOURCE_FILE)
a notre Makefile.

Et tapons les commandes:
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
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...???

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.