3

我以前没有使用过 Visual Studio。我在业余时间开始了一个个人项目,我想使用测试驱动开发,因为它在我的 Java 开发中对我来说是一个巨大的好处。我很久以前就开始了这个项目,我使用了 CppUnit。我知道可能还有其他更好的框架,但这是已经存在的。

我的 Visual Stuido 2005 解决方案中有 2 个项目。当单元测试位于应用程序代码旁边时,它工作得很好。随着项目规模的扩大,这变得非常麻烦和不雅。我在我的解决方案下创建了一个新项目来容纳单元测试(所以它现在有 3 个项目)。一切都很顺利,直到我尝试构建解决方案。一切都已编译,但单元测试项目无法链接。对于我的测试调用的每个函数,输出为我提供了 51 个“未解决的外部符号”错误 (LNK2019)。

据我推断,问题在于 Visual Studio 创建的目录结构。每个项目都有自己的目录,然后在其下方是创建的目标文件和可执行文件。我认为问题在于,虽然头文件正确包含在每个单元测试中,但链接器无法找到 cpp 文件,因为它们位于不同的目录中。当它找不到被调用函数的实现时,它给了我 2019 错误。

我对问题的评估是否正确?我该如何解决?我是否需要完全重新组织我的项目或者是链接器的简单配置?

谢谢

4

3 回答 3

1

听起来您的测试项目正在使用的主要项目中的函数/类没有被导出。如果未导出代码,则代码所在的 DLL/exe 之外的任何内容都无法引用它。

我们处理这个问题的一种常见方法是向项目添加一个定义(在项目设置中,转到配置属性 -> C/C++ -> 预处理器,第一行有定义)称为PROJECTNAME_IMPL(确保你这样做对于调试和发布配置!)。然后有一个头文件(称为 ProjectNameExport.h),任何导出的内容都包括在内,其中包含如下内容:

#ifdef PROJECTNAME_IMPL
    #define PROJECTNAME_API __declspec(dllexport)
#else
    #define PROJECTNAME_API __declspec(dllimport)
#endif

然后,在定义一个类时(例如):

#include "ProjectNameExport.h"

class PROJECTNAME_API Foo
{
};

当头文件包含在项目内的文件中时导出类,并在头文件包含在另一个项目的文件中时导入类(当然,链接到第一个项目)。

于 2008-11-25T20:17:38.877 回答
1

我总是将要测试的代码添加到单独的静态 .lib 文件中,并让主应用程序 EXE 和单元测试 EXE 依赖于此。.lib 项目添加了新代码,依赖项支持确保 EXE 链接没有错误。您需要确保 EXE 项目可以找到 .lib 标头,但这取决于您的目录结构。您还必须注意 .lib 和 EXE 使用相同的 CRT/MFC 库(例如,当使用 CRT 时,您可以静态链接它或使用 DLL)。

我发现以这种方式使用库比将文件/头添加到多个项目更容易维护。

我正在使用 Boost 测试框架,但无论 TDD 框架如何,我都会采用相同的结构。

可以在此处找到有关类似设置的好文章:

http://www.codeproject.com/KB/architecture/Designing_Robust_Objects.aspx

于 2008-11-25T20:29:20.867 回答
1

是的,你的评价听起来不错。试试这个:在解决方案资源管理器中,右键单击包含您的测试的项目的名称,然后选择“项目依赖项”。检查它所依赖的每个项目。这应该设置链接器设置,以便它可以自动找到正确的文件。

于 2008-11-18T02:56:59.323 回答