Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何链接我自己的pthread库_C_Linux_Multithreading_Gcc_X86 64 - Fatal编程技术网

C 如何链接我自己的pthread库

C 如何链接我自己的pthread库,c,linux,multithreading,gcc,x86-64,C,Linux,Multithreading,Gcc,X86 64,我想对用于我的程序的pthread库进行一些修改。这就是为什么我想链接我自己修改过的pthread库。我可以将glibc中的源代码用于pthread,修改它并将其用于我的程序 通常使用标记-pthread链接原始pthread库。如何在makefile中指定链接到我自己的库。-pthread与gcc/glibc的-lpthread-D_可重入性等效。您也可以这样做,但使用不同的链接参数(-lname of library)。只需使用-L选项指定自定义库所在的目录,并使用-L选项指定库的名称。 例

我想对用于我的程序的
pthread
库进行一些修改。这就是为什么我想链接我自己修改过的pthread库。我可以将
glibc
中的源代码用于
pthread
,修改它并将其用于我的程序


通常使用标记
-pthread
链接原始
pthread
库。如何在makefile中指定链接到我自己的库。

-pthread
与gcc/glibc的
-lpthread-D_可重入性
等效。您也可以这样做,但使用不同的链接参数(
-lname of library
)。

只需使用-L选项指定自定义库所在的目录,并使用-L选项指定库的名称。 例如:

在这种情况下,您的库名称应该是libmypthread.so

有关更多详细信息,请参阅

要确保在执行程序时找到要加载的库,请执行以下操作

export LD_LIBRARY_PATH = $(LD_LIBRARY_PATH):/root/x/mylib

使用不同的名称编译库,例如,
libmypthread.so
,并将其放在
LD_library_PATH
环境变量中包含的一个目录中(或添加新目录)。现在您可以使用
-lmypthread
链接到库。

不要使用
-pthread
。这是一个未记录的GCC选项,可能是为了与其他(Solaris?)编译器兼容


glibc中完全不需要它启用的
-D_可重入定义
-pthread
;为了线程安全,没有任何头依赖于此宏。(最后一个这样的机制是在1998年从glibc头中删除的!)只需在
-lpthread
中链接就足以将glibc函数切换到线程安全模式,并且
-lpthread
可以用您自己的库替换,就像另一个答案所说的那样。

请确认您的特定gcc版本是正确的。使用
gcc-dumpspecs | grep“%{pthread”。原来你不需要<代码> -dyReCuvuts,即只是<>代码>库< /Cord>的名字应该是足够的,你可以考虑把<代码> -rPATS/<代码>选项传递给链接器,而不是:<代码> -WL,-RPATH MyLiBudir < /Cord>,如果我有语法正确的话。不幸的是,这是事情的方式,它可能不是正确的G。cc.理论上,gcc假定使用POSIX不兼容的内存模型,因此它可能会执行错误地跨同步移动访问的优化,并且您需要
-pthread
-std=c11
使其使用正确的内存模型。我从未遇到过这样的情况:它很重要,但我记得在一个线程上读取了一个线程邮件列表或gcc错误跟踪器上,这是gcc开发人员的态度,可能涉及到一个真正的错误…哦,我现在想起了这个问题。它作为一个更大的类型访问内存,并且影响位字段。gcc忽略位字段上声明的整数类型,通常执行更大的读取/修改/写入周期(例如64位)加载/存储操作,如果恰好与内存中的位字段相邻的数据被另一个线程(甚至是信号处理程序)访问,这可能非常危险。假定
-pthread
禁用该行为,现在可能有一个单独的
-f
选项。有趣的是,这是Linux内核的问题。
-pthread
没有被GCC记录,所以他们可以自由赋予它新的含义。
export LD_LIBRARY_PATH = $(LD_LIBRARY_PATH):/root/x/mylib