2010-12-17 5 views
4

Ich habe eine Reihe von Funktionen in meinem "C" -Code. Wenn ich .so kompiliere, sehe ich alle Namen in der Ergebnisdatei .so. Wie kann ich (in Code oder in make file) angeben, dass nur einige Funktionen exportiert werden sollen, während andere nur für den internen Gebrauch privat sind.Wie kann ich angeben, welche Funktion beim Erstellen des C-Codes aus der .so-Bibliothek exportiert werden soll?

+0

Ich denke, die DEF-Dateien für diese verwendet werden können. – ruslik

+0

@ruslik das ist Windows – alternative

Antwort

7

Wenn Sie möchten, dass eine Funktion in der Datei (technisch, die "Kompilierungseinheit"), die sie enthält, intern bleibt, deklarieren Sie sie als "statisch". Zum Beispiel

static int privateAddOne(int x) { return x + 1; } 
+2

Private zur Kompilierungseinheit und private zur Bibliothek sind kaum das Gleiche - die meisten nicht-trivialen Bibliotheken haben viele Quelldateien. –

17

Da Sie .so Dateien erwähnen, scheint es wie eine vernünftige Annahme, dass Sie gcc oder ein gcc-alike-Compiler.

Standardmäßig sind alle extern Funktionen im verknüpften Objekt sichtbar. Sie können Funktionen (und globale Variablen) auf einer Fall-zu-Fall-Basis verstecken das hidden Attribut (während sie extern zu halten, die sie von anderen Quelldateien können in derselben Bibliothek verwendet werden):

int __attribute__((visibility("hidden"))) foo(void) 
{ 
    return 10; 
} 

Alternativ können Sie den Standardwert auf hidden ändern, indem Sie die Option -fvisibility=hidden zur Kompilierungszeit an gcc übergeben. Sie können dann bestimmte Funktionen für den Export markieren mit:

__attribute__((visibility("default"))) 
+1

+1 Ehrlich gesagt ist dies eine bessere Antwort (in der es mächtiger ist) als die akzeptierte. Natürlich sollten Sie eine Mischung der beiden verwenden! – alternative

+0

+1 Um eine weitere Option hinzuzufügen, können Sie eine Kombination aus ID-Linker und Versions-Scripts verwenden, um ein ähnliches Ergebnis zu erzielen, ohne den Quellcode zu berühren. – vanza

+0

Diese Antwort ist richtig, aber Sie sollten sie nie verwenden. Code, der davon abhängt, Symbole mit Sichtbarkeit zu verstecken, um zu vermeiden, den Namensraum zu verschmutzen und das aufrufende Programm zu brechen, ist von Natur aus nicht tragbar. Wenn Sie externe Funktionen benötigen, die nicht außerhalb der Bibliothek verwendet werden sollen, sollten Sie ihren Namen einfach einen bibliotheksspezifischen Junk voranstellen (aber keine führenden Unterstriche). –

Verwandte Themen