我想在我的静态用户库中使用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',如果用户库中的底层机制发生更改,则需要更改多次。)
最佳答案
静态库实际上是对象文件的愚蠢存档之上的一个小调味汁。特别是,它们不跟踪对其他库的依赖关系。
gcc中是否有类似的东西,或者有其他方法避免在每个依赖项目中指定'-lpthread'。
…
'-lpthread'可能需要数百次,如果用户库中的底层机制发生更改,则需要更改同样多次
在unix世界中,这通常是在构建系统级别完成的(例如,如果处理autoconf,可以适当地设置LIBS
环境变量)。
注意pragma或我的用户库中的等效机制只需键入一次
但pragma的语义并没有很好地指定。首先,如果不同的源文件中有两个pragma,那么应该首先链接哪个库?