2012-03-10 66 views
2

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

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

+2

请参阅http://stackoverflow.com/questions/2127797/gcc-significance-of-pthread-flag-when-compiling – Christoph 2012-03-10 11:05:43

回答

2

-pthread相当于-lpthread -D_REENTRANT用gcc/glibc的。您可以做同样的事情,但使用不同的链接参数(-lname-of-library)。

+1

您可以确认这是你的特定gcc版本。使用'gcc -dumpspecs | grep“%{pthread”'。 – 2012-03-10 11:27:18

+0

事实证明你并不是真的需要'-D_REENTRANT',也就是'-lname-of-library'应该足够了 – Christoph 2012-03-10 11:48:02

4

只需使用-L选项指定自定义库存在的目录并使用-l选项指定库的名称。 对于防爆:

-L/root/x/mylib -lmypthread 

在这种情况下,你的lib名字应该libmypthread.so

参考http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html了解更多详情。

要确保库发现,当你执行你的程序加载,做

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

你可能会考虑将'-rpath'选项传递给链接器:'-Wl,-rpath $ MYLIB_DIR',如果我有正确的语法。 – 2012-03-10 11:34:10

0

在一个不同的名称编译库,例如libmypthread.so并把它包含在你的LD_LIBRARY_PATH的目录之一环境变量(或添加一个新目录)。现在您可以使用-lmypthread链接到您的图书馆。

2

请勿使用-pthread。这是一个未公开的GCC选项,可能与其他一些(Solaris?)编译器兼容。

-D_REENTRANT定义它-pthread使是在glibc的完全不必要;为了线程安全,没有头文件依赖于这个宏。 (最后一个这样的机制在1998年从glibc头文件中删除!)简单地链接-lpthread就足以将glibc函数切换到线程安全模式,并且-lpthread可以用您自己的库代替,就像其他答案所说的那样。

+0

请参阅http://gcc.gnu.org/ml/gcc/2010-05/msg00062.html – Christoph 2012-03-10 11:46:09

+0

不幸的是,虽然事情*应该是*的方式,但它可能不适用于gcc。理论上,gcc应该使用POSIX不兼容的内存模型,因为它可能会执行错误地在同步过程中错误移动访问的优化,并且您需要'-pthread'或'-std = c11'来使其使用正确的内存模型。我从来没有遇到一个重要的情况,但我记得在一个邮件列表或gcc bug跟踪器上阅读一个线索,这是gcc开发人员的态度,它可能涉及一个真正的bug ... – 2012-03-10 12:26:16

+0

哦,我记得现在的问题。它以更大的类型访问内存,并影响位域。 gcc忽略位域上声明的整数类型,并且通常以更大(例如64位)的加载/存储操作执行读取/修改/写入循环,如果恰好与存储器中的位域相邻的数据可能是非常危险的被另一个线程(甚至是信号处理程序)访问。假设'-pthread'禁用了这个行为,现在可能有一个单独的'-f'选项。有趣的是,这是破解的Linux *内核。 – 2012-03-10 12:29:28

相关问题