C++ 一些未导出到静态库中的函数/方法-Visual Studio 2019 C++;

C++ 一些未导出到静态库中的函数/方法-Visual Studio 2019 C++;,c++,visual-studio,linker-errors,C++,Visual Studio,Linker Errors,如果这是一个格式不正确的问题,请道歉。但我甚至不知道从哪里开始调试 我有一个库,里面保存着通用代码。我将其构建为一个静态库,以包含在我的项目中。库和项目都是用C++编写的,内置Visual Studio 2019。 我刚刚对一些代码做了一些修改(这恰好是为了处理时间和日期),突然间,我所讨论的.cpp文件中的大多数函数和方法不再导出到我的静态库中 当我尝试使用这些函数/方法时,我现在遇到未解决的符号链接器错误。我跑了 dumpbin/symbols/exports mylibrary.lib>e

如果这是一个格式不正确的问题,请道歉。但我甚至不知道从哪里开始调试

我有一个库,里面保存着通用代码。我将其构建为一个静态库,以包含在我的项目中。库和项目都是用C++编写的,内置Visual Studio 2019。 我刚刚对一些代码做了一些修改(这恰好是为了处理时间和日期),突然间,我所讨论的.cpp文件中的大多数函数和方法不再导出到我的静态库中

当我尝试使用这些函数/方法时,我现在遇到未解决的符号链接器错误。我跑了
dumpbin/symbols/exports mylibrary.lib>exports.txt
搜索此输出时,只列出了与我的函数/方法定义相关联的少数符号。我的大多数方法都缺少符号,包括那些有链接器错误的方法

我的问题是-我是否已经做了足够的工作来证明我的函数没有被导出-即
dumpbin/symbols/exports
是否是正确的命令?其次,如果我正确地执行了该检查,那么我怎么可能只导出了一些方法/函数,并且我可以采取任何步骤来修复它或进一步调试它?在构建静态库时,我甚至没有意识到这是可能的

请注意,我正在构建一个静态库,而不是导入库或dll

编辑:

未导出的方法的一个示例是

constexpr int sci::UtcTime::getYear() const
{
    return m_cTime.tm_year+1900;
}
其中,
sci
是名称空间,
UtcTime
是我的时间相关类,
m\u-cTime
UtcTime
std::tm
成员变量

我尝试过清理和重建一切,甚至在绝望中重新启动我的电脑

编辑2:
删除
constexpr
似乎会导致导出符号并解决链接器问题。为什么会是这种情况?

正如我在评论中提到的,
constepr
意味着
内联
,这会导致编译器根本不发出符号

你的编辑也是这种情况的实证证据。我想说,它正在按预期工作。现在,您可以选择是要导出函数还是要限定函数


至于您现在开始看到这一点的原因,在过去5年左右的时间里,VC++一直在经历与法规遵从性相关的更改,通常每个版本在发布时都比以前的版本更符合最新的语言标准。

您是否使用模板?否,我没有使用模板。可能是
constexpr
在使用模板。它出现得更早吗?如果编译器在编译时没有地方不能计算调用,那么它可能根本不会发出调用。我想你是对的。但奇怪的是,这个方法
constexpr void sci::UtcTime::set(int year,unsigned int month,unsigned int dayOfMonth,unsigned int hour,unsigned int minute,double second)
是导出的,当然,是否真正内联函数的选择是由编译器做出的。也许编译器选择内联简单的getYear方法,但选择不内联更复杂的set方法?VC充满了特性和自相矛盾。在gcc中尝试一下,看看会发生什么。尽管如此,如果您使用的是
\uuu dllexport()
,gcc可能无法理解。根据这一点,我的理解是,编译错误应该发生,因为函数块无法访问方法定义。这个编译错误肯定会使我的调试更加容易。我已经生成了一个最小的示例,并向msdn提交了一份错误报告。