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?
Antwort
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; }
Private zur Kompilierungseinheit und private zur Bibliothek sind kaum das Gleiche - die meisten nicht-trivialen Bibliotheken haben viele Quelldateien. –
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 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
+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
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). –
- 1. Wie kann ich angeben, welcher Oracle-Client installiert werden soll?
- 2. AutoLayout: Kann ich angeben, welche Constraint bei Bedarf brechen und ein Backup erstellen soll?
- 3. Kann ich bedingt auswählen, welche Variable zugewiesen werden soll?
- 4. Wie kann ich angeben, ob JSON oder XML in der ASP.NET-Web-API verwendet werden soll?
- 5. (EF6) Wie kann ich einen anderen ConnectionString angeben, der mit automatischen Migrationen verwendet werden soll?
- 6. Entity Framework - Vorlage beim Generieren des Modells angeben
- 7. Wie kann ich angeben, welche Android-Tool-Version in Maven erstellen
- 8. Wie kann ich jQuery sagen, dass eine Funktion nur auf einer bestimmten Webseite ausgeführt werden soll?
- 9. Welche Datenstruktur soll verwendet werden?
- 10. Kann ich Spaltentypen beim Erstellen einer SQL Server-Ansicht angeben?
- 11. Wie angeben, welche TestNG Test zur Laufzeit
- 12. Welche Hadoop-Version soll verwendet werden?
- 13. Welche Diagramm verwendet werden soll Algorithmus Logik
- 14. Welche InitialContextFactory soll ich verwenden?
- 15. Wie wählt die Kompilierung aus, welche Template-Funktion aufgerufen werden soll?
- 16. Welche URL soll ich verwenden?
- 17. Wie soll der allgemeine Typ einer "Lemma" -Funktion verstanden werden?
- 18. Wie Sie angeben, welche externe JS-Datei beim Aufruf der Funktion
- 19. IDs des Anfangsknotens beim Erstellen eines Graphen aus der Kantenliste
- 20. Wie geben Sie an, welche Django-Version verwendet werden soll?
- 21. Generieren privaten Schlüssel, der nicht exportiert werden kann
- 22. Nuget Wie kann ich den Speicherort des Pakets angeben?
- 23. Wie kann der gesamte Quellcode aus Visual Studio in eine Textdatei exportiert werden?
- 24. Wie kann ich mySQL-Host beim lokalen Erstellen der Datenbank angeben?
- 25. Wie kann ich eine Datenbank angeben, die von Django Tests verwendet werden soll, anstatt sie jedes Mal erstellen zu lassen?
- 26. Verwenden von Sequelize Wie kann ich angeben, nach welchem Feld sortiert/begrenzt werden soll?
- 27. Angeben der Gesamtstruktur beim Einfügen/Abrufen des Dokuments in marklogic
- 28. Wie weiß der C++ - Compiler, welche Implementierung einer virtuellen Funktion aufgerufen werden soll?
- 29. welche Funktion soll ich für Split verwenden, um die Zeichenfolge
- 30. Inhalt des Textfelds kann nicht exportiert werden C#
Ich denke, die DEF-Dateien für diese verwendet werden können. – ruslik
@ruslik das ist Windows – alternative