簡體   English   中英

從C ++靜態庫導出變量

[英]Export variable from C++ static library

我有一個用C ++編寫的靜態庫,我有一個描述數據格式的結構,即

struct Format{
    long fmtId;
    long dataChunkSize;
    long headerSize;

    Format(long, long, long);

    bool operator==(Format const & other) const;
};

一些數據格式被廣泛使用,如{fmtId=0, dataChunkSize=128, headerSize=0}{fmtId=0, dataChunkSize=256, headerSize=0}

一些數據結構類在構造函數中接收格式。 我想為那些廣泛使用的格式提供某種快捷方式,比如我可以通過引用傳遞的幾個全局Format成員gFmt128, gFmt256 我在.cpp文件中實例化它們

Format gFmt128(0, 128, 0);

而且.h有

extern Format gFmt128;

另外,我聲明Format const & Format::Fmt128(){return gFmt128;}並嘗試在主模塊中使用它。

但是如果我嘗試在使用lib的主模塊中執行此操作,則鏈接器會抱怨未解析的外部gFmt128

如何讓我的庫'導出'那些全局變量,所以我可以從其他模塊中使用它們?

不要在全局聲明中使用static關鍵字。 這篇文章解釋了帶/不帶靜態變量的可見性 靜態賦予全局變量內部鏈接,即只在聲明它們的翻譯單元中可見。

它們是否也在.cpp文件中定義? 粗略地說,它應該看起來像:

struct Format
{
    [...]
    static Format gFmt128;
};
// Format.cpp
Format Format::gFmt128 = { 0, 128, 0 }

您需要將Format對象聲明為extern而不是static

Morhveus,我也試過這個。 我的鏈接器說它已經定義了gFmt128符號。 這確實是我期望的行為:編譯器將函數體添加到庫和客戶端對象,因為它在包含文件中定義。

我得到未解決的外部的唯一方法是

  • 不將靜態庫添加到要鏈接的對象
  • 沒有在靜態庫的源文件中定義符號gFmt128

我很困惑......為什么我們會看到不同的東西? 你能解釋一下會發生什么嗎

暫無
暫無

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

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