Linux下创建依赖Ogg外部库的C++静态库时遭遇链接错误求助
Linux下创建依赖Ogg外部库的C++静态库时遭遇链接错误求助
嗨,我来帮你梳理下问题所在,其实是两个容易忽略的小细节导致的链接错误,咱们一步步解决:
1. 你生成的不是真正的静态库
你当前用来创建OIT.a的命令有问题:
g++ -c -o OIT.a OpusInfoTest.cpp -I ../ogg/buildl/include/ogg -I ../ogg/buildl/include -I ../opustools/src -I ../ogg/include/ogg -I ../ogg/include/ -Wno-write-strings -L ../ogg/buildl -l:libogg.a
g++ -c的作用是只编译源代码生成目标文件(.o),你这里把输出后缀改成.a,本质上还是单个目标文件,不是标准的静态库。正确的静态库生成步骤应该分两步:
- 第一步:编译生成目标文件
g++ -c -o OpusInfoTest.o OpusInfoTest.cpp -I ../ogg/buildl/include/ogg -I ../ogg/buildl/include -I ../opustools/src -I ../ogg/include/ogg -I ../ogg/include/ -Wno-write-strings - 第二步:用
ar工具打包成静态库ar rcs OIT.a OpusInfoTest.o
这里ar rcs是创建静态库的标准命令:r表示替换库中已有的文件、c表示创建新库、s表示生成库索引(让链接器更快找到符号)。
2. 静态库的链接顺序搞反了
Linux下链接静态库有个关键规则:依赖其他库的库,必须放在它所依赖的库的前面。
你原来的链接命令是:
g++ main.cpp -I ../ogg/buildl/include/ogg -I ../ogg/buildl/include -I ../opustools/src -I ../ogg/include/ogg -I ../ogg/include/ -Wno-write-strings -L ../ogg/buildl -l:libogg.a -L . -l:OIT.a
这里你先链接了libogg.a,再链接OIT.a。链接器处理静态库时,只会把当前需要用到的符号对应的目标文件拉进来。当处理libogg.a时,链接器还不知道OIT.a需要ogg_sync_init这个符号,所以不会把相关代码包含进来;等处理OIT.a时需要这个符号,链接器已经跳过libogg.a了,自然就报“未定义引用”。
修正后的链接命令应该把OIT.a放在libogg.a前面:
g++ main.cpp -I ../ogg/buildl/include/ogg -I ../ogg/buildl/include -I ../opustools/src -I ../ogg/include/ogg -I ../ogg/include/ -Wno-write-strings -L . -l:OIT.a -L ../ogg/buildl -l:libogg.a
按照上面两步修正后,重新生成静态库再编译main.cpp,应该就能顺利解决这个链接错误啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

