Ayant des problemes de linkage ces jours ci, je m amuse a faire des exemples minimaux pour comprendre un peu mieux ce qui se passe. Mon reel probleme est que je cherche a compiler un .so qui linke une archive .a tierce, et que je cherche a comprendre pourquoi je suis oblige d utiliser a la compil du .so -Wl,--whole-archive XXX.a -Wl,--no-whole-archive pour que les symboles de XXX.a soient definis dans le .so.
J ai cru comprendre que whole-archive copiait complement l archive .a dans le .so ainsi que les symboles, ce qui implique que le comportement par defaut de g++ est de ne linker que ce dont il a besoin. Or sur un exemple minimal j ai trouve le contraire.
Ma question est la suivante : Dans l exemple suivant comment forcer gcc a n exporter que les symboles definis dans b.cpp avec leurs eventuelles dependances dans a.cpp mais pas les autres symboles de a.cpp (ici a2.cpp que j aurai voulu ne pas avoir dans libb.so) ?
En gros je voudrais modifier le makefile suivant pour que source.cpp gueule et me file un undef sur a2()
Merci.
EDIT :
En creant un fichier a2.cpp qui contient a2(), la fonction n est plus copiee et on obtient bien un undefined sur a2() au linkage de source.cpp
Donc j en deduis que le linker procede par .o et non pas par symbole pour savoir qui copier.
|
a.cpp
Code :
- #include <iostream>
- void a(){
- std::cout<<"hello world"<<std::endl;
- }
- void a2(){
- std::cout<<"hello world2"<<std::endl;
- }
|
b.cpp
Code :
- void a();
- void b() {
- a();
- }
|
source.cpp
Code :
- void a2();
- void b();
- int main(int argc, char**argv)
- {
- a2();
- b();
- return 0;
- }
|
Makefile
Code :
- all : a b c
- a :
- g++ -c -fPIC -o liba.a a.cpp -I.
- b :
- g++ -shared -fPIC -o libb.so b.cpp liba.a -I.
- c :
- g++ -o app source.cpp libb.so -I.
|
Message édité par chewif le 02-07-2009 à 14:24:56