簡體   English   中英

如何確保在所有靜態對象初始化(等效於DllMain)之后調用全局構造函數?

[英]How to make sure a global constructor is called after all static object initializations (DllMain equivalent)?

我正在嘗試制作C ++庫,並且需要在加載時調用一個函數來對其進行初始化。 我正在使用GCC,因此我嘗試使用__attribute__((constructor)) ,並且該函數實際上是在加載時調用的。

但是前面提到的函數利用了位於不同翻譯單元中的靜態對象,因此,當我需要使用它們時,尚不確定這些翻譯單元中的那些靜態對象是否已初始化。 因此,例如,如果我想在此函數內使用std :: cout,那我就很無聊了。

以下代碼片段很好地演示了該問題:

#include <iostream>

void __attribute__((constructor)) init()
{
    std::cout << "Test\n";
}

int main(int argc, char* argv[])
{
    return 0;
}

在這里,函數init()將在加載時調用,但目前尚不確定std :: cout是否已初始化,並且在嘗試執行第5行時可能會出錯。

所以我的問題是,是否可以確保在構造所有靜態對象之后執行在加載時需要調用的初始化函數?

編輯:我忘了提起這個庫,它將通過使用LD_PRELOAD環境變量將其預加載到另一個程序中來攔截某些調用,因此我不能要求用戶在他的main()中調用lib_init()函數。

如果這將是供第三方使用的庫,則我強烈要求將使用“ init”功能的手動調用作為使用合同的一部分。 否則,您的用戶可能會發現它們處於非常令人不快的情況,被lib的愚蠢行為所束縛。

作為一個證據,有WinSock示例:在調用WSAStartup()之前,假定沒有任何效果。

暫無
暫無

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

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