Je veux combiner des fichiers objets et une bibliothèque statique dans une bibliothèque partagée, mais la bibliothèque statique ne doit pas être exposée, elle est seulement référencée dans les fichiers objets qui vont dans la bibliothèque partagée. Je pense que dans ce cas, je n'ai pas besoin de compiler la bibliothèque statique avec -fPIC
mais je ne sais pas comment indiquer au linker que le fait que je n'utiliserai pas les symboles de la bibliothèque statique. Pour illustrer mon problème, prenons les fichiers suivants :
Fichier foo.cpp
:
#include "static.h"
using namespace std;
string version_info()
{
return static_version_info();
}
Fichier static.cpp
:
#include"static.h"
#include <vector>
using namespace std;
string static_version_info()
{
std::vector<int> ivec;
return to_string(ivec.size());
}
Fichier static.h
:
#ifndef STATIC_H
#define STATIC_H
#include<iostream>
using namespace std;
std::string static_version_info();
#endif
Ensuite, faites
$ g++ -c foo.cpp -o foo.o -fPIC
$ g++ -c static.cpp -o static.o
$ gcc-ar rcs static.a static.o
$ g++ -shared foo.o static.a
/usr/bin/ld: static.a(static.o): relocation R_X86_64_PC32 against symbol `_ZNSt6vectorIiSaIiEEC1Ev' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
Question : Comment puis-je ajuster la dernière commande pour ne pas avoir d'erreur ? Est-ce possible ?
Notez que je ne veux pas compiler static.cpp
avec -fPIC
et je n'ai pas besoin des symboles (ici return_static_version_info()
) dans la bibliothèque partagée.