如何将静态库互相链接?GCC未定义引用问题求助
静态库链接未定义引用问题解决方法
问题分析
你的libocml.a静态库中调用了libocl.a的setStr/unsetStr函数,但链接可执行文件时出现未定义引用错误,核心原因有两个:
- 编译目标文件时错误添加了静态库链接参数,这一步根本不需要链接库
- 链接可执行文件时未引入
libocl.a,且静态库的链接顺序不符合依赖规则
修正后的编译命令
1. 编译libocml模块目标文件
编译.c生成.o文件属于编译阶段,只需要提供头文件路径让编译器找到函数声明,不需要链接静态库。去掉多余的-L src/lib和-locl参数:
gcc -g3 -Wall -Wextra -Werror -I src/inc -I src/lib/*/src/inc -o obj/menu/button.o -c src/menu/button.c
其他libocml模块的编译命令同理,均需移除链接库相关参数。
2. 创建libocml.a静态库
该命令无需修改,保持原样:
ar rcso ../libocml.a obj/sound/sound.o obj/sys/view.o obj/sys/window.o obj/sys/thread.o obj/sys/clock.o obj/menu/text.o obj/menu/button.o
3. 编译并链接可执行文件
链接阶段需要同时引入两个静态库,且遵循依赖库后置的规则:因为libocml.a依赖libocl.a,所以-locml要放在-locl前面,让链接器先处理libocml.a的未定义符号,再从后续的libocl.a中查找符号定义。修正后的命令:
gcc -g3 -Wall -Wextra -I src/inc -I src/lib/*/src/inc -I src/lib/*/src/lib/*/src/inc -L src/lib -o bin/runner.exe obj/main.o -locml -locl -lcsfml-graphics -lcsfml-window -lcsfml-audio -lcsfml-system
关键原理
静态库的链接是按从左到右的顺序处理的:链接器每次处理一个库时,只会记录当前未解析的符号,不会回头查找前面的库。因此,被依赖的库必须放在依赖它的库的右侧,这样当前面的库出现未定义符号时,后续的库能提供对应的符号定义。
内容的提问来源于stack exchange,提问作者Clément MONFORT
相关产品推荐
相关产品推荐

