【发布时间】:2021-07-22 21:56:32
【问题描述】:
我是 C++ 新手。当我编写一个程序时,我希望它能够编译成一个独立的可执行文件,但是对于 C++,有很多关于动态和静态链接的讨论。据我所知,这意味着使用的单独库是单独编译和链接的,而不是一起编译的。
编译时间对我来说不是问题。我不明白为什么我想链接到一个库而不是直接用我的代码编译它。这肯定会带来更好的优化和内联。
一个完美的例子是 tcmalloc。我想使用 tcmalloc 内存分配器,而不是捆绑的分析器,也不是静态或动态链接到它,而是通过内联优化将其直接编译到我的程序中。
我该怎么做?
【问题讨论】:
-
你想要的是静态链接。这将获取所有能够静态链接的库,并将代码插入到可执行程序中。
-
@Someprogrammerdude 它会插入已经编译的代码,作为函数调用,但没有内联优化,对吧?
-
考虑到您的 lib 代码不会经常更改的可能情况,我认为编译时间没有问题。每个合理的构建系统都应该只编译软件的更改部分。因此,即使您每天 100 次编译自己的项目,lib 代码也只需要在这里和那里重新编译。
-
编译三个 .cpp 文件然后将生成的三个 .obj 文件链接在一起之间绝对没有区别;并将其中两个文件组合成一个静态库,然后链接一个 .obj 文件和一个 .lib 文件。静态库只不过是一组目标文件,为了便于管理而归档在一起。 “内联优化”是通过将代码放入 header 文件来实现的,因此编译器可以在调用函数时看到实现。
-
您可以将LTO 与静态链接一起使用。正如人们已经提到的,静态链接这些库和将这些库的源包含到您的构建中没有区别。
标签: c++ static-linking tcmalloc