zlib导致简单的android二进制崩溃

时间:2018-08-16 17:27:23

标签: android c++ cmake android-ndk zlib

我用CMake创建了一个简单的android可执行文件,该文件与ndk上的本机zlib链接。一切都能正确编译,但是在调用deflateInit时出现了分段错误。

代码如下:

main.cpp

#include <iostream>
#include <zlib.h>

int main()
{
    z_stream strm;
    deflateInit(&strm, Z_DEFAULT_COMPRESSION);
    std::cout << "it works!" << std::endl;
}

以及相应的CMakeLists.txt

cmake_minimum_required(VERSION 3.8)
project(zlib-on-android)

add_executable(main main.cpp)

find_package(ZLIB REQUIRED)

set_target_properties(main
  PROPERTIES POSITION_INDEPENDENT_CODE ON)

target_link_libraries(main PUBLIC ZLIB::ZLIB)

然后我使用以下命令进行编译:

cmake -H. -Bbuild -DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=~/android-ndk-r17b -DCMAKE_ANDROID_STL_TYPE=c++_static -DCMAKE_SYSTEM_VERSION=16 -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang

一切正常。然后,我执行以下操作:

cd build
adb push main /data/local/tmp/.
adb shell
shell@device:/ $ cd /data/local/tmp
shell@device:/ $ ./main
[1] + Stopped (signal)     ./main

有人知道原因吗?我在尝试用此可执行文件连接gdb时遇到很多麻烦。由于相同的代码可在Macosx上运行,因此我无法理解为什么它无法在android上运行。

编辑

由于某些原因,相同的代码在Macosx上崩溃(起作用的是相似的代码)。这是错误:bus error ./main

1 个答案:

答案 0 :(得分:1)

好吧,事实证明,将frame.SetIcon(wx.Icon("path/to/app.ico")) 设置为零可以解决问题。

frame.SetIcon(wx.IconFromLocation("path/to/app.ico"))