静态链接CppUnit时如何解决‘未定义引用’错误?
解决CppUnit静态链接的未定义引用问题
我明白你现在遇到的困境——动态链接CppUnit没问题,但静态链接就报一堆未定义引用错误。别着急,这其实是GCC静态链接时库的顺序问题导致的,咱们一步步解决:
问题根源
GCC的链接器处理静态库和动态库的逻辑不一样:
- 动态链接时,库的顺序影响不大,因为动态符号是运行时解析的;
- 静态链接时,链接器是从左到右依次处理文件和库的。如果先处理静态库,此时还没有任何未定义的符号(因为还没编译你的源文件),链接器会直接跳过这个库的内容。等后面处理
test.cpp生成的目标文件时,出现的CppUnit相关未定义符号,就找不到对应的实现了,自然报错。
解决方案:调整编译命令的顺序
把你的源文件test.cpp放在静态库的前面,让链接器先处理源文件,产生未定义符号后再去静态库中查找实现。正确的编译命令应该是:
g++ test.cpp -l:libcppunit.a
运行这个命令后,应该就能成功生成可执行文件了。
额外情况:如果还有未定义引用
如果上面的命令还是报错,可能是CppUnit静态库依赖其他系统库(比如线程库pthread),可以尝试加上对应的依赖库:
g++ test.cpp -l:libcppunit.a -lpthread
验证一下
你可以运行生成的可执行文件,应该能正常输出hello,静态链接也就成功了。
内容的提问来源于stack exchange,提问作者Lone Learner
相关产品推荐
相关产品推荐

