[英]Undefined reference to static const member in g++ if no using code is linked
我正在從事的項目目前包括三個基本的構建目標:
僅當我構建客戶端時才會出現鏈接錯誤。 它是關於內核中的靜態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.