【问题标题】:With gcc, how do I include a library (-lpthread) into my own static user library?使用 gcc,如何将库 (-lpthread) 包含到我自己的静态用户库中?
【发布时间】:2017-10-29 23:54:39
【问题描述】:

我想在我的静态用户库中使用 pthread 的东西,但是除非我将“-lpthread”添加到每个使用它的项目中,否则相关项目不会链接。

我宁愿在我自己的用户库中指定“-lpthread”。实际上,我已经这样做了,但它什么也没做;我仍然需要将'-lpthread'添加到依赖项目,否则我会得到

Invoking: GCC C++ Linker
g++ <....>
/usr/bin/ld: /home/xxx/git/xxx/xxx.CUtil/Debug/libxxx.CUtil.a(EzyThread.o): undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'

IMO 如果我还必须在使用它的项目中包含它的依赖项,它就违背了我自己的用户库的目的;如果我决定使用其他内部机制而不是 pthread 怎么办?

我用过

#pragma comment(lib, "SomeOtherStuff.lib")

在 MS VC 中执行我想要的操作 - 但我现在处于 gcc 环境中。我查看了#pragma comment(lib, "xxx.lib") equivalent under Linux?,它似乎情绪高涨,可用信息低。 gcc 中是否有类似的东西,或者有其他方法可以避免在每个依赖项目中指定“-lpthread”?我知道 C 不是 OOP 但为什么要让每个依赖项都必须弄清楚用户库是如何实现的?

(请不要说#pragma方法之类的东西比'-lpthread'长。注意#pragma或我的用户库中的等效机制只输入一次,但需要'-lpthread'可能数百次,并且如果用户库中的底层机制发生变化,则需要多次更改。)

【问题讨论】:

  • AFAIK 你不能。
  • 这种事情一般委托给构建系统。
  • 会提取.o 并将它们添加到您的库帮助中吗?见ar t /usr/lib/x86_64-linux-gnu/libpthread.aman ar

标签: c gcc static-libraries


【解决方案1】:

静态库实际上是目标文件的愚蠢档案之上的一个小酱。特别是它们不跟踪对其他库的依赖。

在 gcc 中是否有类似的东西,或者有其他方法可以避免在每个依赖项目中指定“-lpthread”? ... “-lpthread”可能需要数百次,并且如果用户库中的底层机制发生变化,则需要多次更改

在 Unix 世界中,这通常在构建系统级别完成(例如,如果您处理 Autoconf,则通过适当地设置 LIBS 环境变量)。

请注意,#pragma 或我的用户库中的等效机制只输入一次

虽然没有很好地指定 pragma 的语义。首先,如果不同的源文件中有两个 pragma,应该先链接哪个库?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2012-11-27
    • 2021-07-29
    • 2021-09-12
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多