例如在 Boost 中。我将 MSVC++2010 中的 include 目录设置为 Boost 根目录,并有一个 #include <boost/regex.hpp>
在我的源代码中。我将 library 目录设置为 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
在其文件名中似乎与相应的文件相同,没有,我可以安全地删除两者之一吗?
最佳答案
boost 库使用一些黑魔法从头文件和编译器选项中选择要链接的库。我真的不知道所有血淋淋的细节,但您可以查看 boost/config/auto_link.hpp header 以获取更多信息。
特别是,这似乎是难题的重要组成部分:
# 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")
关于c++ - C++ 链接器如何知道哪个 .lib 包含哪些函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5184889/