undefinierte Referenz ‘shm_open’, fügen Sie hier bereits das -lrt-Flag hinzu

Lesezeit: 4 Minuten

Benutzeravatar von bxshi
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!

    – Chan-Kim

    1. Juli um 6:50 Uhr

Benutzeravatar von hmjd
hmjd

Bibliotheken am Ende:

gcc test.c -o test -lrt

Aus GCC-Link-Optionen:

-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? 🙂

Der Benutzeravatar von Sold Out
Ausverkauft

Für diejenigen unter Ihnen, die super-auto-magisches CMAKE wie ich verwenden, versuchen Sie Folgendes hinzuzufügen:

target_link_libraries(your_binary_name PRIVATE librt.so)

zu deinem CMakeLists.txt

Alternativ können Sie bei Bedarf PRIVATE durch PUBLIC ersetzen.


Wenn Sie gut etablierte Pfade zu Bibliotheken haben (z. B. alle benötigten Libs in /usr/lib), können Sie nur in angeben CMakeLists.txt:

set(CMAKE_CXX_FLAGS "-lrt")

1402270cookie-checkundefinierte Referenz ‘shm_open’, fügen Sie hier bereits das -lrt-Flag hinzu

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy