android - CMake 中是否有规则导致工具链文件中设置的属性不持久到 CMakeLists?

标签 android android-ndk cross-compiling openal

我正在尝试使用 Android NDK 构建 OpenAL。许可证要求动态加载库。我在尝试构建时收到以下消息:

CMake Warning (dev) at CMakeLists.txt:1032 (ADD_LIBRARY):
  ADD_LIBRARY called with SHARED option but the target platform does not
  support dynamic linking.  Building a STATIC library instead.  This may lead
  to problems.

我的工具链文件包括 SET_PROPERTY(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS true) 并且如下所示:

SET(CMAKE_SYSTEM_NAME Generic)
SET(CMAKE_C_COMPILER "${HOST}-gcc")
SET(CMAKE_CXX_COMPILER "${HOST}-g++")

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

set(ENV{PKG_CONFIG_LIBDIR} "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig")
set(ENV{PKG_CONFIG_PATH} "")

SET_PROPERTY(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS true)

我在源代码中创建了一个 build 目录,并使用以下命令调用 cmake:

cmake .. -DALSOFT_BACKEND_WAVE=0 -DALSOFT_REQUIRE_OPENSL=1 -DALSOFT_NO_CONFIG_UTIL=1 -DALSOFT_EXAMPLES=0 -DALSOFT_UTILS=0 -DALSOFT_CONFIG=0 -DCMAKE_INSTALL_PREFIX=$ANDROID_DEV/opt -DCMAKE_INSTALL_RPATH=$ANDROID_DEV/opt -DHOST= -DCMAKE_TOOLCHAIN_FILE=../../android-toolchain.cmake

我已通过向其添加垃圾并看到 cmake 命令导致错误来验证工具链文件已加载。

CMakeLists.txt 文件的开头如下:

# CMake build file list for OpenAL

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)

PROJECT(OpenAL)

IF(COMMAND CMAKE_POLICY)
  CMAKE_POLICY(SET CMP0003 NEW)
  CMAKE_POLICY(SET CMP0005 NEW)
ENDIF(COMMAND CMAKE_POLICY)

SET(CMAKE_MODULE_PATH "${OpenAL_SOURCE_DIR}/cmake")

我通过将 SET_PROPERTY(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS true) 放在 CMakeList.txt 紧跟在 PROJECT(OpenAL) 。如果我将它放在这之前,构建会生成一个带有前面提到的警告的静态库。

似乎属性 TARGET_SUPPORTS_SHARED_LIBSPROJECT(OpenAL) 之后被重置。我已经阅读了 PROJECTTARGET_SUPPORTS_SHARED_LIBS 的文档并包含了一个工具链文件,但没有找到任何明确提到重置目标工具链变量的内容。

CMake 是否有一些规则导致此变量在工具链文件和 CMakeLists.txt 处理之间重置,或者可能在 PROJECT 命令之前和之后重置?

我正在使用 CMake 2.8.12.2。每次我发出 CMake 命令时,我都会使用源目录的新副本来执行此操作,以确保没有缓存问题。

最佳答案

问题出在“SET(CMAKE_SYSTEM_NAME Generic)”这一行

通用平台将 TARGET_SUPPORTS_SHARED_LIBS 属性覆盖为 false。如果您在这种情况下将 Generic 替换为 Android,它应该可以工作,但它会给您警告。在这种情况下,简单地使用 Linux 作为系统名称可能是更好的选择(Android 在技术上是 Linux 内核的变体)。

我自己在尝试为 VxWorks 平台进行交叉编译时遇到了同样的问题。就我而言,我现在将名称设置为 VxWorks 并暂时忍受烦人的警告。

关于android - CMake 中是否有规则导致工具链文件中设置的属性不持久到 CMakeLists?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40529970/

相关文章:

Android/Eclipse panic : Could not open

android - 在 android 中查找当前位置(基于图像的搜索应用程序)

java - HttpsURLConnection 中的什么方法调用实际发送了 HTTP 请求?

android - 用 C 为 Android 编译一个库

android - 尝试编译 openssl 库 libcrypto.a 的包装器时出错

android - Flutter - 获取 Android 设备名称

android - 在 Android NDK 中使用 STD 和异常

cmake - 交叉编译并链接到 sysroot 中的库 - 怎么了?

erlang - 在 Xeon Phi 上运行 Erlang

c - 交叉编译时询问 C 编译器有关数据类型的信息