【我的C/C++语言学习进阶之旅】在Android Studio里面把部分cpp代码抽出去为单独的cpp类,然后就会出现“undefined reference to“ 问题

一、问题描述

今天在Android Studio想优化下代码,优化操作如下所示:

新增了几个类,如下所示:
在这里插入图片描述

然后编译就报错,如下所示:
在这里插入图片描述

../../../../../framework-native-video-render/filter/DataParsing.cpp:108: error: undefined reference to 'AdjustMonochrome::AdjustMonochrome()'
../../../../../framework-native-video-render/filter/DataParsing.cpp:110: error: undefined reference to 'AdjustMonochrome::setRed(float)'
../../../../../framework-native-video-render/filter/DataParsing.cpp:111: error: undefined reference to 'AdjustMonochrome::setGreen(float)'
../../../../../framework-native-video-render/filter/DataParsing.cpp:112: error: undefined reference to 'AdjustMonochrome::setBlue(float)'
../../../../../framework-native-video-render/filter/DataParsing.cpp:113: error: undefined reference to 'AdjustMonochrome::setCyan(float)'
../../../../../framework-native-video-render/filter/DataParsing.cpp:114: error: undefined reference to 'AdjustMonochrome::setMagenta(float)'
../../../../../framework-native-video-render/filter/DataParsing.cpp:115: error: undefined reference to 'AdjustMonochrome::setYellow(float)'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

二、排查问题

2.1 排查抽取出去的AdjustMonochrome.cpp是否在cmake文件中引入

CMake的配置如下,明显是包含AdjustMonochrome.cpp的,匹配的上这个规则


##自定义搜索规则
file(GLOB src-files
        ${CMAKE_SOURCE_DIR}/*.cpp

        ${CMAKE_SOURCE_DIR}/*/*.cpp

        ${CMAKE_SOURCE_DIR}/*/*/*.cpp

        ${CMAKE_SOURCE_DIR}/*/*/*/*.cpp

        ${CMAKE_SOURCE_DIR}/*/*/*/*/*.cpp

        ${CMAKE_SOURCE_DIR}/*/*/*/*/*/*.cpp

        ${CMAKE_SOURCE_DIR}/*/*/*/*/*/*/*.cpp
)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
        ${PROJECT_NAME}

        # 这句话注释掉,两个so合并成一个so
        # 1. libXtcCustomEffectRender.so
        # 2. libXtcOpenGLCross.so
        # 合并之后只有一个libXtcOpenGLCross.so

        # Sets the library as a shared library.
        # SHARED

        # Provides a relative path to your source file(s).
        ${src-files}
)

在这里插入图片描述
在这里插入图片描述

2.2 使用Clean Project 和 Refresh Linked C++ Projects

使用Clean ProjectRefresh Linked C++ Projects 这两个菜单选项
在这里插入图片描述

  1. 使用这两个菜单之前,有.cxx目录和build目录
    在这里插入图片描述

  2. 使用Clean Project 这个菜单项目之后,build目录被删除了,但是.cxx目录还在!!!
    当时我没有注意去查看这个.cxx目录
    在这里插入图片描述

重新编译,报同样的"undefined reference to" 错误!

  1. 然后我再使用Clean Project这个菜单项并且我接着使用Refresh Linked C++ Projects 这个菜单选项

两个菜单选项执行完毕之后,我就出现编译项目,结果还是出现这个"undefined reference to" 错误。

2.3 解决问题

然后我就去看哪里还有一些编译缓存之类的没有清除,我就发现了上面2.2提到的.cxx目录

然后我将这个.cxx目录直接手动的Delete掉。

在这里插入图片描述
删除之后,重新编译
在这里插入图片描述

然后重新执行了一遍2.2的介绍的Clean ProjectRefresh Linked C++ Projects 这两个菜单选项,接着重新编译就编译成功了
在这里插入图片描述

在这里插入图片描述

Android Studio的缓存真的害死人!!!
Android Studio的缓存真的害死人!!!
Android Studio的缓存真的害死人!!!

三、总结

出现"undefined reference to" 问题的时候,从以下几个方面排查:

  1. 是否你代码真的有问题,从代码方面排查
  2. 代码方面排查发现没有问题的时候,你就得怀疑是不是Android Studio这个坑逼的锅,我出现了好几次这样代码重构之后,必须把所有缓存全部清除才能重新编译成功的,特别注意.cxx目录一定要删除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

字节卷动

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值