【问题标题】:C++ importing libraries instead of linking?C++ 导入库而不是链接?
【发布时间】:2021-07-22 21:56:32
【问题描述】:

我是 C++ 新手。当我编写一个程序时,我希望它能够编译成一个独立的可执行文件,但是对于 C++,有很多关于动态和静态链接的讨论。据我所知,这意味着使用的单独库是单独编译和链接的,而不是一起编译的。

编译时间对我来说不是问题。我不明白为什么我想链接到一个库而不是直接用我的代码编译它。这肯定会带来更好的优化和内联。

一个完美的例子是 tcmalloc。我想使用 tcmalloc 内存分配器,而不是捆绑的分析器,也不是静态或动态链接到它,而是通过内联优化将其直接编译到我的程序中。

我该怎么做?

【问题讨论】:

  • 你想要的静态链接。这将获取所有能够静态链接的库,并将代码插入到可执行程序中。
  • @Someprogrammerdude 它会插入已经编译的代码,作为函数调用,但没有内联优化,对吧?
  • 考虑到您的 lib 代码不会经常更改的可能情况,我认为编译时间没有问题。每个合理的构建系统都应该只编译软件的更改部分。因此,即使您每天 100 次编译自己的项目,lib 代码也只需要在这里和那里重新编译。
  • 编译三个 .cpp 文件然后将生成的三个 .obj 文件链接在一起之间绝对没有区别;并将其中两个文件组合成一个静态库,然后链接一个 .obj 文件和一个 .lib 文件。静态库只不过是一组目标文件,为了便于管理而归档在一起。 “内联优化”是通过将代码放入 header 文件来实现的,因此编译器可以在调用函数时看到实现。
  • 您可以将LTO 与静态链接一起使用。正如人们已经提到的,静态链接这些库和将这些库的源包含到您的构建中没有区别。

标签: c++ static-linking tcmalloc


【解决方案1】:

好的,C++ 编程的一部分是使用库。除非你在做嵌入式编程或一些奇怪的事情,否则你可能永远不会编写一个不包含至少一些其他库的 C++ 程序。如果不出意外,您可以获得标准系统库,因此您可以访问诸如 cout、fopen 或您尝试进行的任何系统调用之类的东西。

如果您出于性能原因想要内联代码,那么它应该作为定义的一部分出现在您的包含文件中。

“将所有内容编译在一起”没有任何优势和一大堆劣势。首先,您可能无法访问大部分代码。然后,您必须知道要包含哪些代码并将其全部归类到一个巨大的文件中。然后编译那个傻瓜,明天再来。

【讨论】:

  • 谢谢...虽然它没有回答我的问题。最后一部分“知道要包括什么”是我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多