簡體   English   中英

函數定義在cpp文件中時鏈接器錯誤

[英]Linker error when function definition is in cpp file

我的解決方案有三個項目:GoogleTest(用於使用Google Test),Vi(用於大部分邏輯)和ViTests(用於使用Vi的單元測試)。 ViTests項目引用Vi項目和Google Test項目。

Vi在v1.h中具有以下代碼

#pragma once

namespace Vi
{
    class Vi1
    {
    public:
        int SomeInt();
    };
}

和匹配的v1.cpp

#include "vi1.h"

namespace Vi
{
    int Vi1::SomeInt()
    {
        return 123;
    }
}

ViTests中的測試功能如下

TEST(Vi1Foo, SomeIntIsSame)
{
    Vi1 v = Vi1{};
    EXPECT_EQ(123, v.SomeInt());
}

鏈接器錯誤說有一個未解析的符號SomeInt 但是,我可以通過內聯函數使鏈接器錯誤消失:

namespace Vi
{
    class Vi1
    {
    public:
        int SomeInt() { return 123; }
    };
}

為什么單元測試項目在放入單獨的cpp文件時沒有找到SomeInt函數定義?

謝謝。

額外的細節很有用:我正在使用Visual Studio 2015。

錯誤消息:

Error   LNK2019 unresolved external symbol "public: int __thiscall Vi::Vi1::SomeInt(void)" (?SomeInt@Vi1@Vi@@QAEHXZ) referenced in function "private: virtual void __thiscall ViTests::Vi1Foo_SomeIntIsSame_Test::TestBody(void)" (?TestBody@Vi1Foo_SomeIntIsSame_Test@ViTests@@EAEXXZ) Vi_Tests    C:\Users\MyName\Vi\Vi_Tests\Vi_Tests.obj    1

項目類型:Vi是Win32應用程序,ViTests是Win32控制台應用程序,GoogleTest是靜態庫。

我是在一個愚蠢的錯誤假設下工作的。 我假設VS只會拾取cpp文件,因為我正在引用包含它們的項目並包含正確的頭文件,但事實並非如此。

nabijaczleweli說我應該“將文件與函數定義”聯系起來。 經過一些網上探索后,我發現了如何做到這一點。 我發現這篇文章概述了一個解決方案。 必須將cpp文件本身添加到測試項目中。 這是通過右鍵單擊ViTests,選擇“添加現有文件”並選擇vi1.cpp來完成的。

這有效,但我對這個解決方案非常不滿意,因為我必須在需要時添加這些文件。 我發現我可以繞過這個將Vi項目的類型改為靜態庫。 在這里描述。 Michael Burr的評論描述了一種鏈接到也可以工作的目標文件的方法。

如果沒有這個帖子中海報的幫助,我不會這么快就想到這一點。 非常感謝你們。

您沒有指定項目的類型。 我猜它們是DLL,因此你希望在它們之外使用的非內聯函數或類需要導出:在源處聲明為__declspec(dllexport)或在DEF文件中列出。

如果你使用__declspec(dllexport),請記住__declspec(dllimport)消費項目中的函數。 這通常通過在.h文件中用作限定符的宏來實現,該宏在不同項目上的解析方式不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM