我正在为线程池创建一个小的静态库,它依赖于其他 2 个自制的静态库(一个自制的printf
和一个自制的 mini libc
)。
但是子功能ft_bzero
在项目中没有链接,除非我在根项目中使用它们,需要使用线程池库的项目。所以我有来自我的thpool
库的链接错误。
样本 :
cc -Wall -Werror -Wextra -MD -I ./ -I ./jqueue -I ../libft/incs -I
../printf/incs -o .objs/thpool_create.o -c ./thpool_create.c
ar rc libthpool.a ./.objs/thpool_create.o etcetc
在库中,我编译每个.o
并使用ar rc libthpool.a *.o
. 然后我.o
从主项目(test.c
实际上是一个)编译,然后
cc .objs/test.o -o test -L./libft -L./printf -L./thpool -lft -lftprintf -lthpool -lpthread
我该如何解决我的错误?
由于ftpool
库中的代码使用来自ft
和 的代码ftprintf
,您(几乎可以肯定)需要以相反的顺序列出库:
cc .objs/test.o -o test -L./libft -L./printf -L./thpool -lthpool -lftprintf -lft -lpthread
扫描静态库时,链接器会查找当前未定义的符号的定义。如果您的测试代码仅调用 中的函数thpool
,则在扫描库ft
时不会引用 中的任何符号ft
,因此库中不包含任何内容;如果ftprintf
在ftprintf
扫描库时没有引用来自的任何符号,则其中ftprintf
任何一个都不包含任何符号。当它遇到thpool
来自ft
or 的引用事物中的符号时,ftprintf
为时已晚;链接器不会重新扫描库。因此,您需要按顺序列出库,以便通过在 (B) 之前链接 (A) 找到从一个库 (A) 到另一个 (B) 的所有引用。如果测试代码引用了ft
或ftprintf
,你可能会走运,或者有点走运;一些符号可能被链接。但是如果有函数在thpool
第一个引用中的函数ft
,按照问题中的顺序,你就失去了链接所有东西的机会。因此建议重新排序。
另一种(非常肮脏但仍然有效)的技术是通过在命令行上多次列出静态库来重新扫描静态库。
对于共享库,链接规则是不同的。如果共享库满足任何符号,则整个库都将可用,因此链接器会记住所有定义的符号,您可能会摆脱原始链接顺序。
您可能需要查找“拓扑排序”。您当然应该致力于设计静态库,以便在依赖项中没有循环;这会导致依赖循环,唯一可靠的解决方案是重新扫描库或合并库。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句