簡體   English   中英

C ++符號導出

[英]c++ symbols exports

我是Linux,Windows和osX上c ++庫的開發人員。 由於osX現在無法正確處理匿名異常,因此我考慮了干凈地標記需要導出的符號。 按照這些說明,我定義了兩個宏: FOO_APIFOO_LOCAL用於標記符號。 現在我有以下問題:

我將每個類都定義在自己的文件中(因為我不需要1000個以上的長文件)。 如果僅在我的庫中使用類A ,則可以使用FOO_LOCAL進行標記。 但是,如果類B具有類型A的私有成員,並且類BFOO_API ,那么我會收到編譯器警告,並且鏈接失敗(未找到符號)。 這似乎無視這些導出屬性的全部含義。 那么,應該是什么呢? 我用class FOO_LOCAL A {...}標記我的班級,對嗎?

也沒有辦法讓所有私人成員都在本地嗎? (由於它們是私有的,因此不應直接訪問它們),這將使標記過程不再那么繁瑣...

最后,當我標記例如異常類時,它會編譯並正常運行,但是顯示符號( nm -C -D my_lib.so )顯示所有符號仍然存在...

您可以使用pimpl習慣用法向公眾隱藏API類的庫內部實現(並因此在鏈接庫時)。

S.th. 喜歡:

B.hpp:

class BImpl;

class FOO_API B
{
public:
    // Public stuff
    B();
    ~B();

    void foo();
private:
    BImpl* bimpl;
};

B.cpp:

#include "B.hpp"
#include "A.hpp"

struct BImpl
{
    void foo()
    {
        // Do something with 'a'
    }

    A a;
};

B::B()
: bimpl(new BImpl())
{
}

B::~B()
{
    delete bimpl;
}

void B::foo()
{
    bimpl->foo();
}

暫無
暫無

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

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