c++ - 如果我在 GCC 中编译和链接不需要的库会怎样?

标签 c++ gcc compiler-construction linker makefile

我想这个标题有点令人困惑,但我会尽力澄清我的意思。 下面我附上了我的制作文件。正如您在第四行看到的,我正在选择我希望我的项目链接到的所有库。

当项目编译时,我看到它正在创建的每个目标文件都与 LIBRA 行指定的所有库链接。并非我项目中的所有文件都需要所有这些库。每个 .cpp 文件中可能只有一两次使用。

这是否会在编译过程中产生任何额外成本?这会创建更大的二进制文件吗?现代编译器是否足够好以至于这不是问题,还是我必须阅读更多关于编译器的文献?

CC=g++
CFLAGS=-c -Wall -std=c++11 -g 
LDFLAGS+=-ldl
LIBRA= -lboost_system -lboost_filesystem -lboost_thread -lsigar-x86_64-linux -ldl -lsqlite3
LIBB=-L/home/tensai/SIGAR/lib -L/usr/include -L/usr/local/lib
SOURCES=main.cpp config_reader.cpp database_manager.cpp monitor_agent.cpp analyze_agent.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=lnmp
INCLUDES = -I/home/tensai/SIGAR

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) $(INCLUDES) $(LIBB) -o $@ $(LIBRA)

.cpp.o:
    $(CC) $(CFLAGS) $(INCLUDES) $(LIBB) $< -o $@ $(LIBRA)

clean: 
    rm *.o

最佳答案

静态库只有在提供链接过程中此时 undefined symbol 时才会被引入。如果它们不包含此类符号,它们将被忽略。在极少数情况下,不必要的库仍然会造成伤害,因为它们定义的符号应该由稍后出现在命令行中的系统库解析,在这种情况下,链接器会从最先出现的库中获取代码。然而,这真的很少见。
对于动态库,情况有所不同:如果您将不需要的动态库 (.so) 提供给链接器,它很可能会将对它们的引用放入可执行文件中,并且您最好让这些库在运行时可用。二进制文件在这里不会变大,但如果您打算单独分发一些可执行文件,它会受到伤害:

$ cat x.c
int main(){return 14;}

$ gcc x.c -o xx -l ssl3 -L .

$ ./xx
./xx: error while loading shared libraries: libssl3.so: cannot open shared object file: No such file or directory

$ gcc x.c -o xx

$ ./xx

$

关于c++ - 如果我在 GCC 中编译和链接不需要的库会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20060193/

相关文章:

c++ - EventLog 函数返回 ERROR_INVALID_PARAMETER

c++ - 使用指针指向字符串中的某些字符

gcc - 如何抑制 GCC 链接器警告?

c++ - gcc 函数属性 - 如何使用它们?

c++ - GCC 错误与否:默认 std::function?

c# - .net 中的 IL 和堆栈实现?

c++ - 使用 gdb 打印 ip 地址

c++ - std::for_each 似乎正在清理 std::string

c - 使用 pragma pack(1) 时是否存在性能问题?

compiler-construction - 是什么让 COBOL 及其性能(与其年龄相比)如此之快?