簡體   English   中英

如果未鏈接使用代碼,則對g ++中的靜態const成員的未定義引用

[英]Undefined reference to static const member in g++ if no using code is linked

我正在從事的項目目前包括三個基本的構建目標:

  • 核心,包含幾乎所有的類
  • 測試僅包含幾個測試類和一個主要功能。 他們(希望)接觸核心中的每段代碼。
  • 客戶端僅由一個主要功能組成,該主要功能用於從核心創建一個對象並調用當前稱為Hello World的功能。 現在,主體完全是空的,它並沒有采取任何措施消除錯誤。

僅當我構建客戶端時才會出現鏈接錯誤。 它是關於內核中的靜態const的,如下所示:

class Transition
{
private:
  Transition();
  ...more declarations...

public:
  static const Transition NO_TRANSITION
  ...more declarations...
}

Map.cpp中的用法:

Transition Map::searchTransition(Coordinate p, Direction d)
{
  ...code...
  return Transition::NO_TRANSITION;
}

這是g ++告訴我的:

obj / gpp / Debug / Game / Map / Map.o:Map.cpp:(.rdata $ .refptr._ZN10Transition13NO_TRANSIT IONE [.refptr._ZN10Transition13NO_TRANSITIONE] + 0x0):未定義對“ Transition :: NO_TRANSITION”的引用

Map.cpp也是核心的一部分,它包括Transition.h,而.o文件恰好位於預期位置。 兩個涉及的文件之間沒有前向聲明。

最讓我困擾的是:只有在構建客戶端時才會發生這種情況。 如果我將內核與測試類及其主要類鏈接在一起,則效果很好,這意味着僅可以鏈接更多代碼。 唯一刪除的是一個很小的甚至是空的main函數,而實際上被Map和Transition所使用的一個更大的main函數所取代。

而且,該靜態const並不是什么新鮮事物,並且過去從未引起過問題。 既然測試接受了它,我認為一切都很好,但是顯然只有在測試鏈接到它的情況下。

我試着在一個較小的項目中重新創建該錯誤,而makefile是(大部分)相同的,但是該錯誤不會顯示。 我完全不知道重要的區別是什么。

我在cygwin下使用帶有-std = c ++ 11的g ++ 4.8。 Visual Studio可以毫無問題地接受相同的代碼,在真正的linux下,我無法進行測試,盡管我希望它與cygwin相同。

有人知道這里可能出什么問題嗎?

編輯:“奇怪”的行為發生,因為實際上在測試中有一個Transition :: NO_TRANSITION的定義。

您只聲明了它,因此沒有物理位置存儲其數據。 您應該將定義添加到過渡源,並將創建的目標文件與測試鏈接。

// Transition.cpp
#include "transition.h"
const Transition Transition::NO_TRANSITION;

請注意,鏈接器以某種方式延遲工作,即,不搜索您未引用的符號,因此,您的未使用實際NO_TRANSITION實際位置的舊代碼已編譯並鏈接良好。

您必須定義靜態變量。 在您的CPP中,添加此行。

static const Transition::Transition NO_TRANSITION

這樣就可以了。

暫無
暫無

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

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