【发布时间】:2018-08-23 15:43:38
【问题描述】:
我正在使用供应商提供的一些自动生成的 C++ 代码。他们广泛使用 Boost 库,因此我还需要使用 boost 库来创建适当的对象以作为输入发送到供应商方法。它们在自动生成的代码中的 lib 文件夹中提供所有 Boost 头文件。
我以前从未使用过 Boost,但根据我在过去几天收集到的信息,它大部分是仅标头库,这对我来说意味着不需要 *.dlls 或 *.lib 文件在我的软件中使用它,前提是我不使用需要 lib 文件的列出的功能。
我遇到的问题是,当我尝试在构建它时包含“boost\date_time.hpp”时,我收到 LNK1104 错误“无法打开文件 libboost_date_time-vc140-mt-gd-1_38.lib”。我注意到,在 Boost 网站上,它说某些库确实有可选的编译库,具体取决于是否使用了某些功能;对于 date_time 它说如下:
“Boost.DateTime 有一个二进制组件,仅当您使用其 to_string/from_string 或序列化功能,或者您的目标是 Visual C++ 6.x 或 Borland 时才需要该组件。”
我不需要任何需要编译库的功能,并且在我的代码中还没有引用任何功能,只是添加了包含。那么为什么需要这个文件呢?另外,它怎么知道需要什么文件?其中一个头文件中是否隐藏了一个鬼鬼祟祟的#pragma?我开始寻找,但有太多的路要走。
供应商确实为 Boost.DateTime 提供了已编译的 dll 和 lib 文件,但它被命名为“boost_date_time-vc140-mt-gd-1_38.lib”,编译器正在寻找的文件以“lib”为前缀正面。如果确实需要它,那么如何将链接器定向到正确的文件?我知道我可以将文件的名称更改为链接器正在查找的名称(链接器已经具有包含该文件的文件夹的路径,与此无关)但是由于此代码来自供应商代码生成软件它会经常恢复为原始文件名,因此这不是最佳解决方案。
一如既往,感谢您提供的任何帮助。
【问题讨论】:
-
Is there a sneaky #pragma hidden in one of the header files?有。BOOST_ALL_NO_LIB宏禁用此“功能” -
你应该清理你的问题。你从 Boost 开始只是头文件(它不是),后来正确地注意到一些库也编译了组件。没有
data_time这样的东西,它是date_time。如果您不需要 Boost 功能,为什么要包括boost/date_time.hpp?如果您的代码不使用已编译的组件也没关系,如果您使用的第三方代码引用它,您将需要该库。最后,这个供应商没有提供如何使用他们的代码的说明吗? -
πάντα ῥεῖ,问题不在于如何链接到不同版本的 Boost,版本在错误和我试图链接到的文件中都是正确的。问题是我认为它根本不需要 .lib 文件,但如果它确实需要它从哪里获取文件名以及如何更改它。您似乎已将此标记为一个问题的副本,该问题询问如何完全引用不同版本的 Boost。
-
@StevenGillies “如果你想发布它作为答案,我会接受。”除非我(或其他 5 人)决定重新提出问题(我现在就这样做)。无论如何,下次尽量让你的问题尽可能地狭窄和清晰。最好提供一个 minimal reproducible example 来展示你的代码有什么问题,而不是写冗长而令人困惑的散文。
-
@tkausl ^^^^^^^^
标签: c++ visual-studio boost linker header-files