Android Studio中C++ std::list begin()/end()不匹配,疑为CMake问题
解决Android Studio中C++链接错误与std::list迭代器编辑器提示问题
看起来你一开始被编辑器的红色波浪线误导了,实际编译失败的根源是链接错误,而非std::list迭代器本身的问题。我们来一步步拆解解决:
问题根源分析
从错误日志可以看到,所有报错都是undefined reference(未定义引用):
layout::get(int, int)layout::~layout()
这说明你的cellStats-class共享库在链接时,找不到layout类的具体实现——虽然你把layout编译成了单独的layout-class共享库,但没有将这个库链接到依赖它的cellStats-class上。另外,把每个类都做成单独的共享库不仅没必要,还会增加链接复杂度,这也是你遇到问题的核心原因。
解决方案:修正CMakeLists.txt
推荐两种方案,选一种适合你的:
方案1:合并所有源码到一个共享库(最简单)
把所有相关的C++文件都打包到主共享库native-lib中,避免多库依赖的麻烦:
cmake_minimum_required(VERSION 3.4.1) set (CMAKE_CXX_STANDARD 11) # 头文件目录 include_directories(${MY_SOURCE_DIR}/src/main/cpp) # 将所有cpp文件添加到native-lib共享库 add_library(native-lib SHARED src/main/cpp/native-lib.cpp src/main/cpp/cellStats.cpp src/main/cpp/board.cpp src/main/cpp/cell.cpp src/main/cpp/layout.cpp ) # 找到系统log库 find_library(log-lib log) # 链接log库到主库 target_link_libraries(native-lib ${log-lib})
方案2:使用静态库管理依赖(适合模块化场景)
如果想保留类的模块化,可以把各个类做成静态库,再统一链接到主共享库:
cmake_minimum_required(VERSION 3.4.1) set (CMAKE_CXX_STANDARD 11) include_directories(${MY_SOURCE_DIR}/src/main/cpp) # 把各个类编译为静态库(STATIC) add_library(layout-class STATIC src/main/cpp/layout.cpp) add_library(cell-class STATIC src/main/cpp/cell.cpp) add_library(board-class STATIC src/main/cpp/board.cpp) add_library(cellStats-class STATIC src/main/cpp/cellStats.cpp) # 主共享库 add_library(native-lib SHARED src/main/cpp/native-lib.cpp) find_library(log-lib log) # 处理依赖:cellStats依赖layout,先链接这两个 target_link_libraries(cellStats-class layout-class) # 把所有静态库和log库链接到主共享库 target_link_libraries(native-lib cellStats-class board-class cell-class ${log-lib})
解决编辑器红色波浪线问题
编辑器里的std::list迭代器波浪线是Android Studio的代码索引错误,当你修正CMake并同步项目后就会消失:
- 保存修改后的
CMakeLists.txt - 点击顶部菜单栏的
File -> Sync Project with Gradle Files - 等待索引更新完成,波浪线会自动消失
内容的提问来源于stack exchange,提问作者DDriggs00
相关产品推荐
相关产品推荐

