因此,基本上我想知道为什么我的可执行文件将libpthread作为共享库,而我的代码却没有使用任何线程函数。它也不包含在makefile中。是因为默认情况下,GCC是使用“--enable-threads = posix”编译的?

如果是这样,有没有办法将其从我的可执行文件中删除?如果不是,那是什么问题?

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 $@ $(CFLAGS) -c $<

./rgs: $(OBJS)

最佳答案

您正在与librt.so链接:

LFLAGS = -lrt

这是间接依赖关系。
$ 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-lpthread链接。如果您与任何共享库链接,那么您将继承与共享库链接的所有行李。

您不能“将其从可执行文件中删除”。唯一的方法是不与-lrt链接。

关于c++ - Linux-为什么我的可执行文件将libpthread作为共享库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38757269/

10-12 00:13