[英]How is using -pthread not violation ODR rules?
我最近通過 CFFI 進行了 Python 擴展/包構建,它使用pthread_atfork
(和 pthread 互斥鎖)但不鏈接 pthread,即既不指定-pthread
也不指定-lpthread
,因此在具有靜態部分的系統上失敗由於缺少符號,由 libpthread 鏈接腳本(而不是純粹的共享庫)鏈接。
在考慮正確的修復時,我在編譯時偶然發現了-pthread 和 -lpthread 之間的差異。 因此,在編譯和鏈接步驟中使用-pthread
不僅將-lpthread
放置在正確的位置(在上述設置中至關重要),而且還定義了更改函數定義的預處理器符號。
(第三方)函數的一個例子是boost::datetime::c_time::localtime(...)
,它調用localtime_r
或std::localtime
。
這不是(很可能)違反 ODR 的來源嗎? 因此,例如,在沒有-pthread
情況下編譯一個根本不使用線程的簡單靜態庫,並將其鏈接到一個使用線程的二進制文件中,因此使用-pthread
會導致對此類函數的不同定義並且是 UB(/IB?)?
但是從我的/usr/include/features.h
我看到
_REENTRANT, _THREAD_SAFE
Obsolete; equivalent to _POSIX_C_SOURCE=199506L.
所以問題:
-pthread
導致的 ODR 違規,如果是,為什么(這不是避免/故意/疏忽)?-pthread
現在等價於-lpthread
(保存位置)?-pthread, -pthreads, -mthreads
等) -pthread, -pthreads, -mthreads
使用-pthread
很困難在 Linux 上,與-lpthread
相對的標志-pthread
確實只是額外地將標志-D_REENTRANT
傳遞給 gcc 選項,現在已經過時了。
另請參閱features.h
此評論:
/* Some C libraries once required _REENTRANT and/or _THREAD_SAFE to be
defined in all multithreaded code. GNU libc has not required this
for many years. We now treat them as compatibility synonyms for
_POSIX_C_SOURCE=199506L, which is the earliest level of POSIX with
comprehensive support for multithreaded code. Using them never
lowers the selected level of POSIX conformance, only raises it. */
但是,可能仍然存在 C 標准庫實現,它們依賴於在編譯多線程代碼時定義_REENTRANT
。 但是,對於 libc(可能在大多數其他環境中),您可以安全地使用-lpthread
進行編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.