c++ - Android Studio C++ <list> begin()/end() 无匹配函数[可能是 cmake 问题]

标签 c++ android-studio cmake

我刚刚制作了一个程序,可以在 Visual Studio 中完美编译和运行,并且应该与 Android 兼容(不使用特定于操作系统的包含),但是在 C++ STL 列表开始和结束下的 Android Studio 中有一个红色的错误波浪线迭代器函数(以及编译失败的直接结果)。我对 cmake 的经验很少,而且它是与 VS 的唯一区别之一,它似乎是罪魁祸首。

cpp文件:

void cellStats::removeAllMatches(int row, int col, int val)
{
    std::list<layout>::iterator Layout = layoutListPointer.begin(); // Error here
    while (Layout != layoutListPointer.end()) { // Error here
        if (Layout->get(row, col) != val) {
            layoutListPointer.erase(Layout);
        }
        else {
            Layout++;
        }
    }

    update();
}

头文件:

public:
    void cellStats::removeAllMatches(int row, int col, int val)
    //More
private:
    std::list<layout> layoutListPointer;
    //more

CMakeLists.txt:

cmake_minimum_required(VERSION 3.4.1)
set (CMAKE_CXX_STANDARD 11)

include_directories(${MY_SOURCE_DIR}/src/main/cpp)

add_library(native-lib SHARED src/main/cpp/native-lib.cpp )

add_library(cellStats-class SHARED src/main/cpp/cellStats.cpp)
add_library(board-class SHARED src/main/cpp/board.cpp)
add_library(cell-class SHARED src/main/cpp/cell.cpp)
add_library(layout-class SHARED src/main/cpp/layout.cpp)

find_library( # Sets the name of the path variable.
          log-lib

          # Specifies the name of the NDK library that
          # you want CMake to locate.
          log )

target_link_libraries( # Specifies the target library.
           native-lib

           # Links the target library to the log library
           # included in the NDK.
           ${log-lib} )

编辑:错误日志是:

Build command failed.
Error while executing process C:\Users\Metagross\AppData\Local\Android\Sdk\cmake\3.6.4111459\bin\cmake.exe with arguments {--build C:\Users\Metagross\AndroidStudioProjects\VoltorbFlipCalculator2\app\.externalNativeBuild\cmake\debug\x86 --target cellStats-class}
[1/2] Building CXX object CMakeFiles/cellStats-class.dir/src/main/cpp/cellStats.cpp.o
[2/2] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\debug\obj\x86\libcellStats-class.so
FAILED: cmd.exe /C "cd . && C:\Users\Metagross\AppData\Local\Android\Sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe  --target=i686-none-linux-android --gcc-toolchain=C:/Users/Metagross/AppData/Local/Android/Sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/windows-x86_64 --sysroot=C:/Users/Metagross/AppData/Local/Android/Sdk/ndk-bundle/sysroot -fPIC -isystem C:/Users/Metagross/AppData/Local/Android/Sdk/ndk-bundle/sysroot/usr/include/i686-linux-android -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -std=c++11 -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -nostdlib++ --sysroot C:/Users/Metagross/AppData/Local/Android/Sdk/ndk-bundle/platforms/android-21/arch-x86 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -LC:/Users/Metagross/AppData/Local/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/x86 -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libcellStats-class.so -o ..\..\..\..\build\intermediates\cmake\debug\obj\x86\libcellStats-class.so CMakeFiles/cellStats-class.dir/src/main/cpp/cellStats.cpp.o  -latomic -lm "C:/Users/Metagross/AppData/Local/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/x86/libc++_static.a" "C:/Users/Metagross/AppData/Local/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/x86/libc++abi.a" && cd ."
C:\Users\Metagross\AndroidStudioProjects\VoltorbFlipCalculator2\app\src\main\cpp/cellStats.cpp:39: error: undefined reference to 'layout::get(int, int)'
C:\Users\Metagross\AndroidStudioProjects\VoltorbFlipCalculator2\app\src\main\cpp/cellStats.cpp:91: error: undefined reference to 'layout::get(int, int)'
C:/Users/Metagross/AppData/Local/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include/memory:1687: error: undefined reference to 'layout::~layout()'
C:/Users/Metagross/AppData/Local/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include/memory:1687: error: undefined reference to 'layout::~layout()'
C:/Users/Metagross/AppData/Local/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include/memory:1687: error: undefined reference to 'layout::~layout()'
C:/Users/Metagross/AppData/Local/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include/memory:1687: error: undefined reference to 'layout::~layout()'
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

最佳答案

问题在于您组织项目的方式。您有几个小型共享库,它们似乎都相互依赖,但您可能没有根据需要与它们链接。

就像 cellStats-class 库依赖于 layout-class 库(我假设您定义了所有 layout 类函数),但您可能不会链接到它。

除非你打算为不同的程序分别使用所有不同的库,否则我建议你根本不要制作库。而是将所有源添加到您构建的主要目标。


另一方面,您有 undefined behavior在您的代码中。

来自 this std::list::erase reference :

References and iterators to the erased elements are invalidated.

这意味着一旦调用了 erase,就不能再使用迭代器 Layout。如果条件 Layout->get(row, col) != val 为真,即使您可以,也永远不会推进迭代器。

您需要使用erase返回的内容:

Layout = layoutListPointer.erase(Layout);

关于c++ - Android Studio C++ <list> begin()/end() 无匹配函数[可能是 cmake 问题],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50431652/

相关文章:

c++ - 在命令中运行 cmake 'make' 不起作用

c++ - 将文本从一个文件复制到另一个文件

android - Apache HTTP 库在 API 27 中不起作用

java - 有没有办法在Android的Action Bar中应用过滤器

android - Android Studio 更新后无法将 R 解析为变量

c++ - Qt Quick + CMake + 自定义 QObject 导致对 `vtable' 的 undefined reference

linux - 如何使 Cmake 全局可用

c++ - 这是 "Tag Dispatching"吗?

c++ - 将组合框信号连接到 Qt 中的 std::function 的问题

C++ 如何编写一个不是成员函数的运算符?