Android Studio C ++ <list>begin () / end () без соответствующей функции [возможная проблема cmake] - PullRequest
0 голосов
/ 20 мая 2018

Я только что создал программу, которая прекрасно компилируется и работает в Visual Studio, и должна быть совместима с Android (не использует специфичные для ОС включения), но в Android Studio есть красная ошибка при появлении начала и конца списка C ++ stlфункция итератора (а также сбой компиляции как прямой результат).У меня очень мало опыта работы с 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.

1 Ответ

0 голосов
/ 20 мая 2018

Проблема связана с тем, как вы организовали свой проект.У вас есть несколько небольших общих библиотек, которые, кажется, все зависят друг от друга, но вы, вероятно, не связываетесь с ними при необходимости.

Как библиотека cellStats-class зависит от библиотеки layout-class (где я предполагаювы определяете все функции класса layout), но вы, вероятно, не связываетесь с ним.

Если вы не собираетесь использовать все разные библиотеки отдельно для разных программ, я предлагаю не создавать библиотекисовсем.Вместо этого добавьте все источники к основной цели, которую вы строите.


В другой заметке у вас есть неопределенное поведение в вашем коде.

Из этой std::list::erase ссылки :

Ссылки и итераторы для стертых элементов недействительны.

Это означает, что вы больше не можете использоватьитератор Layout как только вы позвоните erase.И даже если бы вы не смогли продвинуть итератор, если выполняется условие Layout->get(row, col) != val.

Вам нужно использовать то, что erase возвращает :

Layout = layoutListPointer.erase(Layout);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...