除非在主项目中使用,否则静态库中的链接错误

迈森

我正在为线程池创建一个小的静态库,它依赖于其他 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,因此库中不包含任何内容;如果ftprintfftprintf扫描库没有引用来自的任何符号,则其中ftprintf任何一个都不包含任何符号当它遇到thpool来自ftor 的引用事物中的符号时ftprintf为时已晚;链接器不会重新扫描库。因此,您需要按顺序列出库,以便通过在 (B) 之前链接 (A) 找到从一个库 (A) 到另一个 (B) 的所有引用。如果测试代码引用了ftftprintf,你可能会走运,或者有点走运;一些符号可能被链接。但是如果有函数在thpool第一个引用中的函数ft,按照问题中的顺序,你就失去了链接所有东西的机会。因此建议重新排序。

另一种(非常肮脏但仍然有效)的技术是通过在命令行上多次列出静态库来重新扫描静态库。

对于共享库,链接规则是不同的。如果共享库满足任何符号,则整个库都将可用,因此链接器会记住所有定义的符号,您可能会摆脱原始链接顺序。

您可能需要查找“拓扑排序”。您当然应该致力于设计静态库,以便在依赖项中没有循环;这会导致依赖循环,唯一可靠的解决方案是重新扫描库或合并库。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

VSCode IntelliSense除非在项目中手动导入,否则不建议使用Angular模块

除非在App Engine项目中,否则Python logging.handlers.SocketHandler不会广播

除非Url在主项目中,否则NoReverseMatch

除非在ag-grid中使用正常的行模型错误,否则无法调用setRowData

除非在引号中,否则如何匹配注释?

除非在观察者方法中再次声明适配器,否则不会显示recyclerview中的项目

添加库项目并在主项目中使用它

除非在IDE中运行,否则在Python中从MySql读取Bytearray会遇到解码错误

除非在调试模式下刷新 Cordova iOS 项目,否则无法正确加载源

除非在JWT中如何使用通配符?

除非在$ scope中传递,否则AngularJS ng-include不包括视图

除非在命令行标志中引用,否则反斜杠将被删除

除非在func中,否则AppDelegate类型var不是成员(请参见图片)

除非在每个文件中都引用,否则在TS文件中找不到名称“ $”

除非在全局范围内,否则不能使用dojo / query

如何在Android主项目中包含库项目中使用的AAR文件

除非在Spring Boot Web MVCApp中使用HandlerInterceptor不满足某些条件,否则如何重定向到URL

在主项目中找不到链接到Cocoapod的静态框架

编织时,除非在RStudio中运行,否则网状无法访问Python中的R变量

除非在捕获列表中,否则不能在lambda主体中引用封闭函数局部变量

为什么除非在数组中,否则带有类的“ as”关键字不起作用?

除非在SLES中重新启动crond,否则为什么新的cronjobs会被忽略?

除非在 React 中刷新页面,否则按钮的事件侦听器不起作用

除非在Mac OS X上使用pf.conf激活OpenVPN连接,否则请阻止传出流量

除非在“ jsx”为“ react-jsx”时提供“ --jsx”标志,否则无法使用JSX

使用宏查找首字母缩写词,除非在Word / VBA中以(

除非在perl中等于!在JavaScript中?

Unity 检查 rect 的重叠工作,除非在 gridlayoutgroup 中

如何在C ++项目中使用Swift静态库(.a)?