如果我在GCC中编译和链接不需要的库会发生什么?

时间:2013-11-18 23:30:58

标签: c++ gcc compiler-construction linker makefile

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

当项目编译时,我看到它正在创建的每个目标文件都链接到使用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

1 个答案:

答案 0 :(得分:5)

只有在链接过程中提供未定义的符号时,才会引入静态库。如果它们不包含这些符号,则会被忽略。在极少数情况下,不必要的库仍然可能会受到影响,因为它们定义了应该由稍后在命令行上的系统库解析的符号,在这种情况下,链接器从任何库中获取代码。但是,真的罕见 对于动态库,它是不同的:如果您将不需要的动态库(.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

$