【发布时间】:2020-04-03 09:55:33
【问题描述】:
我最近通过 CFFI 构建了一个 Python 扩展/包,它使用 pthread_atfork(和一个 pthread 互斥锁)但不链接 pthread,即既未指定 -pthread 也未指定 -lpthread,因此在系统上失败由于缺少符号,它有一个静态部分,由 libpthread 链接脚本(而不是纯粹的共享库)链接。
在考虑正确的修复方法时,我偶然发现了 Difference between -pthread and -lpthread while compiling。因此,在编译和链接步骤中使用-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(保存展示位置)? - 应该使用什么来为 Python 构建 CFFI 扩展?由于依赖于编译器的命名,使用
-pthread很困难(-pthread, -pthreads, -mthreads,...)
【问题讨论】:
标签: c++ c pthreads one-definition-rule