【问题标题】:What happens if I compile and link with unneeded libraries in GCC?如果我在 GCC 中编译和链接不需要的库会发生什么?
【发布时间】:2013-12-02 08:03:12
【问题描述】:

我想标题有点令人困惑,但我会尝试澄清我的意思。 下面我附上了我的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

【问题讨论】:

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


【解决方案1】:

仅当静态库提供在链接过程中此时未定义的符号时才会被引入。如果它们不包含此类符号,则它们将被忽略。在极少数情况下,不必要的库仍然会受到伤害,因为它们定义了应该由稍后出现在命令行的系统库解析的符号,在这种情况下,链接器从首先出现的库中获取代码。但是,这真的很少见。
使用动态库则不同:如果您将不需要的动态库 (.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

$

【讨论】:

    猜你喜欢
    • 2015-09-18
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    相关资源
    最近更新 更多