Отключить флаг компиляции ANDROID для одного файла - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь скомпилировать исполняемый двоичный файл, который будет упакован с моим Java-приложением для Android. Исполняемый файл VMD содержит основной файл vmdmain.C со следующим

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

Кажется, что android ndk с cmake неявно устанавливает флаг ANDROID через -DANDROID. Это приводит к тому, что указанная выше основная функция определяется как VMDmain. Конечно, без основной функции исполняемый файл не может связать, выдав ошибку:

/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)

где директива add_executable в том же файле CMakeLists.txt выглядит как

add_executable(
    vmd

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

, что приводит к следующей записи в ключе "command" для vmdmain.c в compile_commands.json (добавлены разрывы строк, некоторые несвязанные флаги компиляции и включены, библиотеки libs для ясности):

/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.

1 Ответ

1 голос
/ 15 марта 2019

Чтобы отключить определение для препроцессора C, используйте

-UANDROID

Это правда, что

#if (ANDROID)

будет работать одинаково для -DANDROID=0 и -UANDROID, но следующее (эквивалентные) операторы ведут себя по-разному:

#if defined(ANDROID)

или

#ifdef ANDROID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...