多次遇到这个问题,每次编译报错的原因又不一样,无奈只能遇到一次记录一次。
undefined reference to symbol ‘_ZN2cv6imreadERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi’
…/…/lib/**.so: 无法添加符号: DSO missing from command line
楼主遇到的场景:项目更新,环境等编译工具都进行了升级,原本正常的编译遇到了大量编译不通过的情况。
解决方案参考:https://segmentfault.com/a/1190000002462705
众所周知,gcc编译的时候,如果文件 A 依赖于 文件B,那么编译的时候必须把A放在B的前面
参考资料的例子:
我们有一个shared libA中,定义了函数foo()
另一个静态库libB显示地链接了libA
一个可执行文件bin_c显示地链接了libA
那么问题来了,如果bin_c中调用了函数foo(),那么编译能不能通过?
在binutils<2.22时,ld正常完成了,bin_c对于foo的调用经由libB,传递到了libA,链接成功。
但是当binutils>=2.22时,编译出错了,ld会报上面的错,告诉你foo这个symbol解析不到。
这时,我们需要编译bin_c时,显示地链接libA才可以通过,否则报以上错误。
如果发现都正常链接了,但还是报错,继续检查链接的顺序。