c++ - C++ 链接器如何知道哪个 .lib 包含哪些函数?

标签 c++ boost linker

例如在 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/

相关文章:

gcc和clang之间的C++不一致

c++ - Boost 多精度舍入模式

c++ - 这等同于 std::string 吗?

c++ - 最小 "extern"使用测试用例的未定义​​引用问题

c++ - cmake 和 libcxx 的链接器错误

python - 是否可以像 python f-strings 那样在 C++ 中格式化字符串?

c++ - VC++ 中的动态数组大小和动态数组分配器

java - 在 C++ 中访问 Java byte[]

c++ - 使用 SCons 跨平台构建 Boost

c++ - boost 反序列化优化?