Visual Studios 2008 中 C++ 开发中的链接错误

Posted

技术标签:

【中文标题】Visual Studios 2008 中 C++ 开发中的链接错误【英文标题】:Linking Error in C++ development in Visual Studios 2008 【发布时间】:2013-06-17 23:05:15 【问题描述】:

我在 Visual Studios 2008 中进行 c++ 移植/开发。 我遇到以下问题。

1) 不允许可变大小的数组。 2)类的任何未定义函数的链接错误,即使它们没有被引用。(错误LNK2001:未解析的外部符号“public:virtual void __thiscall ...)

我觉得这些和c++语言VS2008支持的版本有关。

我正在尝试编译和链接大型 c++ 代码库。我不能用 new/alloc 替换可变大小的数组。请给我解决方案,以便我可以使用现有代码。

谁能帮我解决这个问题?

但是下面的代码在同一个 VS2008 中可以正常工作

class Hello

public:
    int a;
public:
virtual void add();
;
class bye : public Hello

public:
    int y;
public:
    void add();
;

int main()

    std::cout << "got";

我哪里错了?

【问题讨论】:

据我所知,any 标准版本的 C++ 中不允许使用 VLA。 我正在尝试将 c++ 代码从 linux 移植到 windows。 g++ 支持 VLA 是的,作为扩展。正如您所发现的,Visual Studio 没有。这就是它的结束。如果你真的“不能用 new/alloc 替换可变大小的数组”,那你就不走运了。 @CarlNorum 我遇到的两个问题都是这种情况吗? 你的其他问题更简单——只需实现函数即可。 【参考方案1】:

如果您在任何地方创建了一个类的单个实例,则认为虚拟函数是“已使用的”。您的链接错误表明某些虚拟功能未实现。由于错误按名称列出了所有这些错误,因此找到它们肯定是一项微不足道的任务,最终确定您是否未能包含某些代码,使用不同的选项编译,或者它们确实在源位置未实现 - 在这种情况下,您可以只添加调用终止的空白实现。

对于 VLA 问题:该扩展在 VS2008 中不存在,期间。即使您等待几年并且 VS201y 将在 C++14 中实现新的类似 VLA 的东西,它也不会回到您选择的编译器。 (如果你让我选择一个很久以前就失去支持的 5 岁的虫子缠身的野兽,而不是现在的......)

但是std::vector 的功能与 VLA 几乎相同,如果您发现差异,您可以编写更好的包装器或一些适配器函数。无论如何,内存分配的位置不是您可以在程序中合法发现的。万一你遇到了一些性能瓶颈,这对于这样的改变是有疑问的,你可以重新排列一小部分代码。

【讨论】:

【参考方案2】:

使用 std::vector 替换数组怎么样?

【讨论】:

它编译是因为你从不使用/调用任何类或类成员函数。在您的示例中,所有内容都已声明但从未使用过。

以上是关于Visual Studios 2008 中 C++ 开发中的链接错误的主要内容,如果未能解决你的问题,请参考以下文章

由于找不到文件错误,无法在 Visual Studios 中运行 C++ 代码 [重复]

Visual Studios 2012 更改运行时库会导致链接错误,使用 C++

C++如何限制visual studios多处理器编译

可以将其他文件类型添加到 Visual Studios 清理过程吗?

在 Visual Studios 2013 中是不是有某种资源监视器?

Visual Studios 调试设置保存在哪里?