例如在Boost中.我将MSVC++ 2010中的include目录设置为Boost根目录,并#include <boost/regex.hpp>在我的源代码中有一个.我设置了一个库目录,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文件是正确的?如果它扫描所有这些函数以获得正确的函数签名,这是否意味着从两个不同的源(彼此没有链接)编译的2个不同的lib碰巧定义了具有相同名称和参数的函数,不能在一个lib文件夹中?
它是如何知道在所有不同的正则表达式.lib中哪个是正确的?然后,每个文件1_46中的文件似乎与相应的文件相同,我可以安全地删除其中一个吗?
Dav*_*eas 18
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")
Run Code Online (Sandbox Code Playgroud)
大多数lib文件都有一个目录。链接器在寻找符号时会搜索该表。如果找不到该符号,它将继续到下一个库,依此类推,直到搜索完所有库。
一些链接器可能决定从所有库中构建目录。该表将包含符号名称和与其关联的库。这样可以加快搜索符号的速度。
搜索顺序取决于链接器的制造商。对此没有标准也没有要求。链接器可以按照先到先得的方式搜索,先到先在命令行中指定;最后指定的库或其他方法。检查文档中的条件。
同时在网上搜索name mangling。这是编译器用来解决符号命名冲突的技术。
最后,即使只使用一个链接器,链接器也可能包含库中的所有功能。一些链接器仅包含该功能的代码。取决于链接器的制造商。例如,链接器在解析时puts是否包含整个I / O库,还是仅包含必需的功能?包括整个库可加快构建时间,但会使可执行文件庞大。仅包含必需的代码会减慢构建过程,但会缩小可执行文件的大小。
通常,链接阶段是翻译过程中较快的部分之一。如果您担心构建时间,请在一天结束时开始构建,或者在构建开始后散步。;-)
| 归档时间: |
|
| 查看次数: |
2796 次 |
| 最近记录: |