android - 为一个文件禁用 ANDROID 编译标志

标签 android c++ cmake android-ndk

我正在尝试编译一个可执行二进制文件以与我的 Java android 应用程序打包在一起。可执行文件 VMD 有一个主文件 vmdmain.C,内容如下

#if defined(ANDROID)
int VMDmain(int argc, char **argv) {
# else
int main(int argc, char **argv) {
#endif

似乎带有 cmake 的 android ndk 通过 -DANDROID 隐式设置了 ANDROID 标志。这导致上面的 main 函数被定义为 VMDmain。当然,没有 main 函数,可执行文件无法链接,并给出错误:

/home/username/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/24/crtbegin_dynamic.o:crtbegin.c:function _start_main: error: undefined reference to 'main'

因此,我只想为文件 vmdmain.C 取消设置 ANDROID 标志,这样主函数将被命名为 main 而不是 VMDmain。我在 CMakeLists.txt 中尝试过

set_source_files_properties(src/main/vmd/vmd-1.9.3/src/vmdmain.C PROPERTIES COMPILE_FLAGS -DANDROID=0)

同一 CMakeLists.txt 文件中的 add_executable 指令看起来像

add_executable(
    vmd

    src/main/vmd/vmd-1.9.3/src/vmdmain.C
    # other files...
)

这导致在 compile_commands.json 中 vmdmain.c 的“命令”键中出现以下条目(添加了换行符,一些不相关的编译标志和包含,为清楚起见排除了库):

/home/username/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ \
  --target=i686-none-linux-android24 \
  --gcc-toolchain=/home/ning/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64 \
  -DARCH_ANDROIDARMV7A \
  -DTCL_LIBRARY=\\\"/home/username/application/app/.externalNativeBuild/cmake/debug/x86\\\" \
  -DTCL_PACKAGE_PATH=\\\"/home/username/application/app/.externalNativeBuild/cmake/debug/x86\\\" \
  -DVMDMSMS \
  -DVMDNANOSHAPER \
  -DVMDPLUGIN_STATIC \
  -DVMDSURF \
  --sysroot /home/ning/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
  -g \
  -DANDROID \
  -fdata-sections \
  -ffunction-sections \
  -funwind-tables \
  -fstack-protector-strong \
  -no-canonical-prefixes \
  -fno-addrsig \
  -Wa,--noexecstack \
  -Wformat \
  -Werror=format-security \
  -stdlib=libc++ \
  -O0 \
  -fno-limit-debug-info \
  -fPIE \
  -DANDROID=0 \
  -o CMakeFiles/vmd.dir/src/main/vmd/vmd-1.9.3/src/vmdmain.C.o \
  -c /home/ning/github/palantir/app/src/main/vmd/vmd-1.9.3/src/vmdmain.C

但是,这似乎行不通。我仍然得到相同的 undefined reference to main 错误。

最佳答案

要禁用 C 预处理器的定义,请使用

-UANDROID

这是真的

#if (ANDROID)

-DANDROID=0-UANDROID 的作用相同,但以下(等效)语句的行为不同:

#if defined(ANDROID)

#ifdef ANDROID

关于android - 为一个文件禁用 ANDROID 编译标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55178721/

相关文章:

linux - 交叉编译和CMake?

c++ - 使用 ncurses 和 cmake 链接期间 undefined reference

android - 获取联系人的照片内容时出现异常..

java - 指定 Cipher.getInstance() 参数?

android - 如何在android中将excel表转换成sqlite数据库

android - dalvik VM VFY代码的含义

c++ - 依赖初始化顺序

c++ - 使用 MSYS : X11 not found 构建 GLEW

c++ - 从初始值设定项列表返回值

c++ - 使用cmake复制所有qt资源