两个项目:
- 加载器,一个独立的可执行文件(只加载模块)
- 任何模块,一个共享库(librainbowdash.so)(可以有很多模块)
现在,该模块与 链接-lpthreads
,但我得到了一些奇怪的错误,这让我认为 pthreads 仅绑定为共享对象,并且当加载器加载模块时 pthreads 没有被加载。(用 GDB 调试是不可能的,那种错误)。
我以为-l
开关只允许静态库?可以?不是吗?
两个项目:
现在,该模块与 链接-lpthreads
,但我得到了一些奇怪的错误,这让我认为 pthreads 仅绑定为共享对象,并且当加载器加载模块时 pthreads 没有被加载。(用 GDB 调试是不可能的,那种错误)。
我以为-l
开关只允许静态库?可以?不是吗?
-l
指定库名称。由链接器将库名称解析为静态库或要链接的共享对象。加载使用的任何共享库是加载器的工作。
如果您查看 ld 和 gcc 联机帮助页,可以定义“选项组”,我可能有点生疏,但它应该类似于
gcc -o yourprog -Wl,-Bstatic yourprog.c -lstatic_lib -Wl,-Bdynamic -ldynamic_lib
确切的咒语可能是错误的。
根据经验,通过静态库的完整路径已证明比弄清楚上述咒语的确切形式要容易得多。
话虽如此,我怀疑您是否会通过静态链接 pthread 获得很多好处。
我想你也可以使用
gcc -pthread ...
也是。
使用简单的 -static 将使输出及其所有依赖项变为静态。这可能不是你想要的。
可能是您的共享库指向lpthread
错误的位置。使用ldd
例如工具ldd libfoo.so
通常是查找此类链接问题的非常有效的方法。