【问题标题】:How to generate clang compiler flag using CMake generator-expression for android build如何使用 CMake 生成器表达式为 android 构建生成 clang 编译器标志
【发布时间】:2017-09-22 15:26:25
【问题描述】:

我正在尝试将 clang PrecompiledHeader 用于此处找到的 CMake: https://gist.github.com/leeor/316168500765cf51ae97

这是来自这里的拉取请求: https://github.com/larsch/cmake-precompiled-header

执行此操作时,我在 export_all_flags 函数的第 22 行遇到错误:

CMake Error at cmake/Modules/android/PrecompiledHeader.cmake:22 (file):
  Error evaluating generator expression:
    $<BOOL:-isystem /Users/XXXXX/Library/Android/sdk/ndk-bundle/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=24 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fno-integrated-as -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -frtti -fexceptions -std=c++14 -pthread -DUSE_FILE32API=1 -DCC_ENABLE_CHIPMUNK_INTEGRATION=0 -DCC_ENABLE_SCRIPT_BINDING=0 -DCC_USE_PHYSICS=0 -DCC_LUA_ENGINE_DEBUG=0 -DCC_USE_3D_PHYSICS=0 -DCC_ENABLE_BULLET_INTEGRATION=0 -DCC_USE_NAVMESH=0 -DCC_USE_TIFF=0 -DCC_USE_WEBP=0 -DRAPIDJSON_HAS_STDSTRING=1 -std=c++11 -Wno-deprecated-declarations -Wno-reorder -Wno-invalid-offsetof -fPIC -stdlib=libc++ -fsigned-char -latomic>
  $<BOOL> expression requires exactly one parameter.

如何正确使用 CMake 生成器表达式来生成正确的编译器选项列表,然后传递给 clang 编译器?

注意:

如果我更换了

set(_cmake_cxx_flags "$<$<BOOL:${CMAKE_CXX_FLAGS}>:$<JOIN:${CMAKE_CXX_FLAGS},\n>\n>")

set(_cmake_cxx_flags "$<$<JOIN:${CMAKE_CXX_FLAGS},\n>\n>")

我得到一个不同的错误:

Error evaluating generator expression:
    $<$<JOIN:-isystem /Users/XXXXX/Library/Android/sdk/ndk-bundle/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=24 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fno-integrated-as -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -frtti -fexceptions -std=c++14 -pthread -DUSE_FILE32API=1 -DCC_ENABLE_CHIPMUNK_INTEGRATION=0 -DCC_ENABLE_SCRIPT_BINDING=0 -DCC_USE_PHYSICS=0 -DCC_LUA_ENGINE_DEBUG=0 -DCC_USE_3D_PHYSICS=0 -DCC_ENABLE_BULLET_INTEGRATION=0 -DCC_USE_NAVMESH=0 -DCC_USE_TIFF=0 -DCC_USE_WEBP=0 -DRAPIDJSON_HAS_STDSTRING=1 -std=c++11 -Wno-deprecated-declarations -Wno-reorder -Wno-invalid-offsetof -fPIC -stdlib=libc++ -fsigned-char -latomic,
  >
  >
  Expression did not evaluate to a known generator expression

【问题讨论】:

  • 为什么要为 CMAKE_CXX_FLAGS 变量使用生成器表达式?此变量不依赖配置(依赖配置的部分应在 CMAKE_CXX_FLAGS_ 变量中)。使用简单的string(REPLACE) 连接此变量的部分,用空格分隔:string(REPLACE " " ",\n" _cmake_cxx_flags ${CMAKE_CXX_FLAGS})

标签: android c++ cmake


【解决方案1】:

感谢 tsyvarev 评论,我能够使用

解决错误

string(REPLACE " " "\n" _cmake_cxx_flags ${CMAKE_CXX_FLAGS})

我仍然有问题,因为 clang++ 抱怨在尝试输出多个文件时使用了 -o 选项,但至少编译器选项可以正常工作。

【讨论】:

    猜你喜欢
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    相关资源
    最近更新 更多