我正在尝试编译要与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标志。这导致上面的主要功能改为定义为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函数命名为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
错误。
答案 0 :(得分:1)
要禁用C预处理程序的定义,请使用
-UANDROID
确实是
#if (ANDROID)
对于-DANDROID=0
和-UANDROID
的工作方式相同,但是以下(等效)语句的行为有所不同:
#if defined(ANDROID)
或
#ifdef ANDROID