>

Java android 응용 프로그램과 함께 패키지로 실행 가능한 바이너리를 컴파일하려고합니다. 실행 파일 VMD에는 다음과 같은 기본 파일 vmdmain.C가 있습니다

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

cmake가있는 안드로이드 ndk는 암묵적으로 -DANDROID 를 통해 ANDROID 플래그를 설정하는 것으로 보입니다. . 이로 인해 위의 주요 기능이 대신 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 플래그를 설정 해제하여 주 함수의 이름이 VMDmain 대신 main으로 지정되도록합니다. 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...
)

이것은 compile_commands.json의 vmdmain.c에 대한 "command"키에 다음 항목을 생성합니다 (줄 바꿈 추가, 관련없는 컴파일 플래그 및 포함, 명확성을 위해 제외 된 lib) :

/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# - vs2013/vs2017에서 다른 창에서 이중으로 표시
  • 다음 osquery - osquery - 모든 osqueryi 쿼리에서 자세한 마이그레이션 정보 제거