undefinierte Referenz ‘shm_open’, fügen Sie hier bereits das -lrt-Flag hinzu
Lesezeit: 4 Minuten
bxshi
Ich habe gerade einen Systemabsturz und installiere Ubuntu 11.10 neu, und mein Code erzeugt diesen seltsamen Fehler.
Ich habe ein einfaches Codebeispiel geschrieben, um zu testen, wo das Problem liegt:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
int main (void) {
int i;
i = shm_open ("/tmp/shared", O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); printf ("shm_open rc = %d\n", i);
shm_unlink ("/tmp/shared");
return (0);
}
und der Kompilierbefehl ist
gcc -lrt test.c -o test
Der Fehler ist:
/tmp/ccxVIUiP.o: In function `main':
test.c:(.text+0x21): undefined reference to `shm_open'
test.c:(.text+0x46): undefined reference to `shm_unlink'
collect2: ld returned 1 exit status
Ich habe bereits -lrt lib hinzugefügt, warum wird es immer noch nicht kompiliert?
Ich denke, Sie möchten vielleicht -pthread, aber ich habe die Gründe vergessen.
– Blauverschiebung
29. März 2012 um 10:55 Uhr
danke, der Computer meines Mentors muss -pthread hinzufügen, es ist eine verbesserte Version von lpthread mit threadsicheren Funktionen. und ich könnte einfach lrt hinzufügen. Ich denke, sowohl lrt als auch pthread sind die Bibliotheken von POSIX?
– bxshi
29. März 2012 um 12:11 Uhr
@bxshi: POSIX gibt keine Bibliotheksnamen an; Die verschiedenen Unix-Varianten haben Funktionen in unterschiedlich benannten Bibliotheken.
– Fred Foo
29. März 2012 um 14:29 Uhr
Dieser Titel beantwortete meine Frage: ah, ich brauche -lrt!
– Ciro Santilli OurBigBook.com
7. August 2015 um 10:32 Uhr
Ah, man shm_open zeigt an Link with -lrt im Abschnitt SYNOPSYS!
-llibrary
-l library
Search the library named library when linking.
(The second alternative with the library as a separate argument
is only for POSIX compliance and is not recommended.)
It makes a difference where in the command you write this option;
the linker searches and processes libraries and object files in the
order they are specified.
Thus, `foo.o -lz bar.o' searches library `z' after file foo.o but
before bar.o. If bar.o refers to functions in `z', those functions
may not be loaded.
Ich denke, das Hinzufügen von Bibliotheken irgendwo in der Mitte funktioniert auch. Nur neugierig warum gcc behandelt die Reihenfolge als so wichtig?
– Pavan Manjunath
29. März 2012 um 10:26 Uhr
Dieses Mal muss ich lib am Ende dieses gcc-Befehls hinzufügen, aber bevor ich mein Linux neu installiere, könnte ich lib gleich danach hinzufügen gcc und es könnte auch kompilieren. Wie ist das passiert? Gibt es dazu eine Konfigurationsdatei oder -variable?
– bxshi
29. März 2012 um 10:30 Uhr
@PavanManjunath: Neuere GCC-Versionen akzeptieren Bibliotheken überall auf der Befehlszeile und in beliebiger Reihenfolge. Ältere erfordern, dass sie zuletzt und in Abhängigkeitsreihenfolge aufgeführt werden (also alles, was erfordert librt kommt davor).
– Fred Foo
29. März 2012 um 10:30 Uhr
@PavanManjunath: Es muss. Bibliotheken werden durchsucht in Ordnung undefinierte Symbole aufzulösen. Wenn die Reihenfolge keine Rolle spielen würde, gäbe es keine Möglichkeit zu kontrollieren, welche Bibliothek verwendet wurde, wenn das gewünschte Symbol in zwei oder mehr Bibliotheken definiert ist, die Sie durchsuchen werden.
– R.. GitHub HÖR AUF, EIS ZU HELFEN
29. März 2012 um 14:04 Uhr
@R ..: Mein GCC (Debian 4.4.5-8) verknüpft das Programm des OP problemlos mit der angegebenen Befehlszeile. Ich bin mir nicht sicher, wann diese Funktion eingeführt wurde und wie genau sie implementiert ist, aber sie hat schon früher zu vielen SO-Fragen geführt.
– Fred Foo
29. März 2012 um 14:27 Uhr
Ändern Sie die Kompilierzeile von
gcc -lrt test.c -o test
zu
gcc test.c -o test -lrt
Muss gcc am Ende immer lib hinzufügen? Ich habe meinen Code und mein Makefile nicht geändert, aber bevor ich meinen Computer neu installiere, funktioniert es ganz gut.
– bxshi
29. März 2012 um 10:28 Uhr
Im Expert C programming Seite 108: <Handy Heuristic>
Where to Put Library Options:Always put the -l library options at the rightmost end of your compilation command line.
Aber es sagt nicht warum, also denke ich, das ist eine Art Regel? 🙂
Ausverkauft
Für diejenigen unter Ihnen, die super-auto-magisches CMAKE wie ich verwenden, versuchen Sie Folgendes hinzuzufügen:
Ich denke, Sie möchten vielleicht -pthread, aber ich habe die Gründe vergessen.
– Blauverschiebung
29. März 2012 um 10:55 Uhr
danke, der Computer meines Mentors muss -pthread hinzufügen, es ist eine verbesserte Version von lpthread mit threadsicheren Funktionen. und ich könnte einfach lrt hinzufügen. Ich denke, sowohl lrt als auch pthread sind die Bibliotheken von POSIX?
– bxshi
29. März 2012 um 12:11 Uhr
@bxshi: POSIX gibt keine Bibliotheksnamen an; Die verschiedenen Unix-Varianten haben Funktionen in unterschiedlich benannten Bibliotheken.
– Fred Foo
29. März 2012 um 14:29 Uhr
Dieser Titel beantwortete meine Frage: ah, ich brauche
-lrt
!– Ciro Santilli OurBigBook.com
7. August 2015 um 10:32 Uhr
Ah,
man shm_open
zeigt anLink with -lrt
im Abschnitt SYNOPSYS!– Chan-Kim
1. Juli um 6:50 Uhr