2017-12-15 8 views
0

Ich versuche, eine static library mit shared library zu verknüpfen und diese wirft mir eine Fehlermeldung, recompile with -fPICLD: eine gemeinsame Bibliothek zu einer statischen Bibliothek verknüpfen

Hier ist, was ich habe versucht, an einem Beispiel:

[email protected]:~/Junk$ cat common.h 
#include <stdio.h> 
#include <stdlib.h> 

void func1(int *p); 
void func2(); 

Gemeinsam genutzte Bibliothek Code:

[email protected]:~/Junk$ cat shared.c 
#include "common.h" 

void func2() 
{ 
    int i=10; 
    func1(&i); 
} 

Und die statische Code-Bibliothek:

#include "common.h" 

int k; 

void func1(int *p) 
{ 
    printf("%d\n", *p); 
} 

Nun sehen Sie, dass die gemeinsam genutzte Bibliothek die API der statischen Bibliothek verwendet.

Hier ist, wie ich zusammengestellt:

gcc -c static.c 

ar rcs libStatic.a static.o 

gcc -c shared.c 

gcc -shared -fPIC -o libShared.so shared.o -L. -lStatic 

Nach dem letzten Befehl, erhalte ich folgende Fehlermeldung:

/usr/bin/ld: ./libStatic.a(static.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC 
./libStatic.a: error adding symbols: Bad value 
collect2: error: ld returned 1 exit status 

Ich habe tatsächlich static library von einem Anbieter und ich versuche, ein bauen shared library auf Spitze davon. Ich habe nicht die Quelle der statischen Bibliothek.

ich eine andere Art von Fehler zu sagen:

relocation R_ARM_THM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC 
error adding symbols: Bad value 
collect2: error: ld returned 1 exit status 

ich durch so viele Artikel ging, aber in der Lage konnte nicht herausfinden. Bitte helfen Sie mir, das zu beheben.

Referenzen:

Reference-1

Reference-2

Antwort

0

In Ihrem obigen Beispiel müssen Sie -fPIC verwenden, wenn Objektdateien für Ihre statische Bibliothek zu kompilieren. Wenn Sie diese Option weglassen, kann der kompilierte Code nicht in ein gemeinsames Objekt eingebunden werden. Wenn Sie nur die statische Bibliothek und keinen Quellcode haben, können Sie nichts dagegen tun. Bitten Sie den Ersteller der Bibliothek, Ihnen eine Kompilierung bereitzustellen, in der -fPIC aktiviert ist.

+0

Können wir '-fPIC' für statische Bibliotheken verwenden ?. Jedenfalls habe ich versucht, '-fPIC' zu verwenden, wie in 'gcc -c static.c -fPIC', was den gleichen Fehler verursacht –

+1

Sie müssen alle Ihre Objekte kompilieren, die Teil der lib mit' -fPIC' sind. Also füge es auch zu shared.c hinzu. Haben Sie Ihr '.a' mit dem aktualisierten Objekt neu erstellt? –

Verwandte Themen