2012-03-29 6 views
24

Ich habe gerade einen Systemabsturz und neu installieren Ubuntu 11.10, und mein Code produziert diesen seltsamen Fehler.undefined Verweis 'shm_open', schon hinzufügen -lrt Flag hier

schrieb ich ein einfaches Code-Beispiel zu testen, wo das Problem ist:

#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 die Kompilierungsbefehl 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 

I habe bereits -lrt lib hinzugefügt, warum kompiliert es immer noch nicht?

+0

Ich glaube, Sie -pthread wollen, aber ich vergessen? die Gründe. – blueshift

+0

danke, der Computer meines Mentors muss -thread hinzufügen, es ist eine verbesserte Version von lpthread mit thread-safe-Funktionen. und ich könnte einfach lrt hinzufügen. Ich denke, sowohl lrt als auch pthread sind die Bibliotheken von POSIX? – bxshi

+0

@bxshi: POSIX gibt keine Bibliotheksnamen an; Die verschiedenen Unix-Varianten haben Funktionen in unterschiedlich benannten Bibliotheken. –

Antwort

40

Bibliotheken am Ende:

gcc test.c -o Test -lrt

Von GCC Link Options:

 
-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. 
+1

Ich denke, das Hinzufügen von Bibliotheken irgendwo in der Mitte funktioniert auch. Nur neugierig, warum 'gcc' die Bestellung so wichtig behandelt? –

+0

Ich war so dumm ... Danke. – bxshi

+1

Dieses Mal muss ich am Ende dieses gcc-Befehls lib hinzufügen, aber bevor ich mein Linux neu installiere, könnte ich lib direkt nach 'gcc' hinzufügen und es könnte auch kompilieren. Wie ist das passiert? Gibt es eine Konfigurationsdatei oder -variable dazu? – bxshi

3

Ändern der Kompilierung Linie von

gcc -lrt test.c -o test 

zu

gcc test.c -o test -lrt 
+0

Muss gcc am Ende immer lib hinzufügen?Ich habe meinen Code und Makefile nicht geändert, aber bevor ich meinen Computer neu installiere, funktioniert es einfach in Ordnung. – bxshi

4

In 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 nicht sagen, warum, so dass ich denke, das ist etwas in der Regel ist :)

Verwandte Themen