2016-08-04 2 views
1

Also im Grunde möchte ich wissen, warum meine ausführbare Datei libpthread als eine gemeinsame Bibliothek hat, während mein Code keine Threading-Funktionen verwendet. Es ist auch nicht im Makefile enthalten. Liegt es daran, dass GCC standardmäßig mit "--enable-threads = posix" kompiliert wird?Linux - Warum hat meine ausführbare Datei libpthread als eine gemeinsame Bibliothek?

Wenn ja, gibt es eine Möglichkeit, es aus meiner ausführbaren Datei zu entfernen? Wenn nicht, was ist das Problem?

LDD

linux-vdso.so.1 => (0x0000656150c5a000) 
    librt.so.1 => /lib64/librt.so.1 (0x0000656150a4c000) 
    libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000656150746000) 
    libm.so.6 => /lib64/libm.so.6 (0x00006561504c1000) 
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00006561502ab000) 
    libc.so.6 => /lib64/libc.so.6 (0x000065614ff17000) 
    libpthread.so.0 => /lib64/libpthread.so.0 (0x000065614fcf9000) 
    /lib64/ld-linux-x86-64.so.2 (0x0000656150c5b000) 

Makefile

CC = gcc 
OFLAGS = -O3 

C++ = g++ -g 
LFLAGS = -lrt 

# API Exclusions 
DFLAGS = -DNO_ZLIB -DNO_LOCALIZATION -DNO_INTERFACE 

CFLAGS = $(OFLAGS) $(DFLAGS) -I. -I../rgapi/include/core/ -I../rgapi/include/public/ 

OBJS = (... list of .o files ...) 
PROGS = ./rgs 

all: $(OBJS) $(PROGS) 

./rgs: $(OBJS) 
    $(C++) -o ./rgs $(OBJS) $(LFLAGS) 

clean: 
    rm -f $(OBJS) $(PROGS) 

$(OBJS): %.o: %.cpp 
    $(C++) -o [email protected] $(CFLAGS) -c $< 

./rgs: $(OBJS) 

Antwort

4

Sie eine Verknüpfung mit librt.so:

LFLAGS = -lrt 

Dies ist eine indirekte Abhängigkeit.

$ ldd /usr/lib64/librt.so 
    linux-vdso.so.1 (0x00007ffcc33d2000) 
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2480a0b000) 
    libc.so.6 => /lib64/libc.so.6 (0x00007f2480649000) 
    /lib64/ld-linux-x86-64.so.2 (0x0000562f4cffb000) 

librt.so mit -lpthread verknüpft. Wenn Sie eine Verknüpfung mit einer gemeinsam genutzten Bibliothek herstellen, übernehmen Sie das gesamte Gepäck, mit dem die gemeinsam genutzte Bibliothek verknüpft ist.

Sie können nicht "es aus Ihrer ausführbaren Datei entfernen". Der einzige Weg, dies zu tun, ist keine Verbindung mit -lrt.

+0

Oh, wow, ernsthaft ... Ok, ich habe librt nicht überprüft, weil ich nicht gedacht habe, dass libpthread als Abhängigkeit verwendet wird. Okay ... Ich verbinde nur -lrt, weil die EXE die Zeit für Intervallaktualisierungen in der Hauptschleife mißt. Gibt es eine Alternative, wo ich Intervalle messen könnte? In der Regel im 50ms-Bereich für die Update-Schleife, ohne clock_gettime zu verwenden, und damit librt verlinken. Was ich gerade mache. –

+0

'gettimeofday()' sollte für diesen Zweck ausreichend sein. –

+0

Ich fragte mich, ob du auch wüsstest, ob ich mir Sorgen über Zeitaktualisierungen machen sollte - ich habe CLOCK_MONOTONIC immer benutzt, weil es in einem Spieleserver verwendet wird und ich nutze die Zeit sowohl für das Aktualisierungsintervall als auch um zu entscheiden, wann eine Verbindung abgelaufen ist aus. Selbst ein paar Sekundensprünge könnten sehr schlecht sein. Soll ich den NTP-Service deaktivieren oder muss ich mir deswegen keine Sorgen machen? –

Verwandte Themen