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

Posted 字节卷动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的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目录一定要删除

以上是关于我的C/C++语言学习进阶之旅在Android Studio里面把部分cpp代码抽出去为单独的cpp类,然后就会出现“undefined reference to“ 问题的主要内容,如果未能解决你的问题,请参考以下文章

我的C/C++语言学习进阶之旅解决使用ninja命令的时候报错:ninja: error: loading ‘build.ninja‘: 系统找不到指定的文件。

我的C/C++语言学习进阶之旅解决使用ninja命令的时候报错:ninja: error: loading ‘build.ninja‘: 系统找不到指定的文件。

我的C/C++语言学习进阶之旅解决使用ninja命令的时候报错:ninja: error: loading ‘build.ninja‘: 系统找不到指定的文件。

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

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

我的C/C++语言学习进阶之旅 通过C++跨平台的预编译宏来区分不同的操作系统:Win32/Win64/Unix/Linux/MacOS/iOS/Android等