C++ 编译报错 undefined reference 找不到引用的问题解决思路
前言
undefined reference 算是一个很常见的编译报错了,其实本质是发生在链接阶段也不是编译的时候。
下面整理一下遇到这个问题时的解决思路,遇到的时候按照步骤排查一下。
步骤
1. 根据报错提示,首先确定找不到的方法是属于哪个库或者源代码的,可以问问百度或者AI这个方法是属于谁的:
- 检查下会不会存在拼写错误之类的。
- 如果是系统库,可以进一步检查系统库目录下是否存在这个库,部分裁剪的系统(如一些开发板)可能缺少一些系统库,这个时候通常就需要下载这个库的源码然后编译生成对应的库或者避免使用该系统库了。
- 如果是第三方的库,加一下日志看看是否真的有链接目标库,比如 cmake 的 target_link_libraries 语句没有指定上需要链接的库。
2. 确认链接的库中是否真的包含找不到的方法
如果你认为找不到的方法是属于某个库的,可以通过下面命令查看库中是否包含指定的方法:
nm -C xxx.a | grep function
注意: xxx.a 是目标库,function替换为方法名。
如果目标库中并不包含指定的方法,就该查查是否使用了错误的库或者错误版本的库。
3. 链接顺序
这个问题笔者在使用 opencv 静态库的时候遇到过,即 cv::resize() 等方法明明存在且库也链接了,但依旧出现很多找不到引用的报错,后面发现链接多个静态库的时候是存在先后顺序的(从后往前)。
可以通过添加编译选项来解决链接顺序问题,如:
target_link_libraries(${PROJECT_NAME}-Wl,--start-group${OPENCV340_LIBS}-Wl,--end-group
)
使用成对的 -Wl,--start-group
和 -Wl,--end-group
将存在链接顺序的一系列静态库包含在其中即可。
4. 动态库方法是否公开
比如内部自己开发的一些公共动态库,但由于忘记将公开的方法指定为公开,而导致使用者无法访问。
可以定义一个公开的宏定义,示例代码:
#ifdef _MSC_VER#define EXPORT_API_ __declspec(dllexport) // Windows
#else#define EXPORT_API_ __attribute__((visibility ("default"))) // Linux
#endif
5. 善用 AI
如果以上依旧没解决,现在AI也挺智能的了,可以把问题贴给AI去看看。