C++链接器如何知道哪些LIB包含哪些函数?

C++链接器如何知道哪些LIB包含哪些函数?,c++,boost,linker,C++,Boost,Linker,例如在Boost中。我在MSVC++2010中将include目录设置为Boost根目录,并在源代码中包含一个include。我将库目录设置为boost\stage\lib,但其中有数百个文件–每个boost库有几个文件,boost::regex有以下文件: libboost_regex-vc100-s-1_46.lib libboost_regex-vc100-mt-gd-1_46.lib libboost_regex-vc100-mt-1_46.lib libboost_regex-vc10

例如在Boost中。我在MSVC++2010中将include目录设置为Boost根目录,并在源代码中包含一个include。我将库目录设置为boost\stage\lib,但其中有数百个文件–每个boost库有几个文件,boost::regex有以下文件:

libboost_regex-vc100-s-1_46.lib libboost_regex-vc100-mt-gd-1_46.lib libboost_regex-vc100-mt-1_46.lib libboost_regex-vc100-mt-s-1_46.lib libboost_regex-vc100-mt-s.lib libboost_regex-vc100-s.lib libboost_regex-vc100-mt.lib libboost_regex-vc100-mt-gd.lib MSVC如何知道所有lib文件中的哪一个是正确的?如果它扫描所有的函数签名,这是否意味着从两个不同的源编译的两个不同的lib不能在一个lib文件夹中,而这两个源没有相互链接,恰好定义了具有相同名称和参数的函数


它如何知道在所有不同的regex.lib中哪个是正确的呢?然后,每个文件名中有1_46的文件似乎与相应的文件相同,如果没有,我可以安全地删除其中一个吗?

包含相同函数的两个库不是问题。链接器只查看它被告知要查看的库。如果其中两个包含相同的函数,它将给出一条错误消息,这实际上是相当常见的,通常是由于与标准库的静态和动态链接之间存在冲突


您可以通过多种方式告诉链接器要查看哪些库—在链接器命令行上(可能是由IDE生成的)和通过pragma commentlib,libname.lib是两种最常见的库。

boost库使用一些暗魔法从头和编译器选项中选择要链接的库。我真的不知道所有的细节,但您可以查看boost/config/auto_link.hpp标题以获取更多信息

特别是,这似乎是谜题中的一个重要部分:

#  pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION ".lib")
大多数lib文件都有一个目录。链接器在查找符号时搜索此表。如果找不到符号,它将移动到下一个库,依此类推,直到搜索完所有库

一些链接器可能决定从所有库中构建目录。此表将包含符号名称及其关联的库。这将加快对符号的搜索

搜索顺序取决于链接器的制造商。对此没有标准或要求。链接器可以按照命令行上指定的先到先得方式进行搜索;指定的最后一个库或其他方法。检查文档中的标准

还可以在web上搜索名称损坏。这是编译器用来解决符号命名冲突的一种技术

最后,链接器可能包括库中的所有函数,即使只使用一个函数。某些链接器仅包含函数的代码。取决于链接器的制造商。例如,在解析puts时,链接器是否包含整个I/O库,还是只包含必要的函数?包括整个库加快了构建时间,但使可执行文件变得巨大。只包含必要的代码会减慢构建过程,但会缩小可执行文件的大小


一般来说,链接阶段是翻译过程中速度较快的部分之一。如果您担心构建时间,请在一天结束时开始构建,或者在构建开始后散步-

我敢打赌,如果你查看regex.hpp内部,你会发现许多pragma库语句或类似语句。我忘了确切的语法,几乎是真的,杰瑞。在两个库中具有两个相同名称的函数是完全有效的,这两个库都在中链接。我这样做是为了有自己的malloc实现,免费的。。。但一个大问题是,您必须确保否决库中第二个定义中的所有外部符号。一旦链接器解析了一个符号名,它就不会再寻找该符号的第二次出现。嗯,很好。我只是想知道为什么他们不在名称中包含地址类型32/64位。在这两个版本中编译模块仍然需要一些手动工作,因为库路径不能同时是这两个版本的默认boost\stage\lib。这解释了链接器的一般工作方式,但它没有回答这个问题。Boost神奇地链接到正确的lib文件,而不需要程序员指定它,但是如何呢?