我正在尝试用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

我已经通过向toolchain文件添加垃圾并看到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的文档,包括一个toolchain文件,但是没有发现任何明确提到重置目标toolchain变量的内容。
cmake是否有一些规则导致此变量在工具链文件和cmakelists.txt处理之间重置,或者在PROJECT命令之前和之后重置?
我正在使用cmake 2.8.12.2。每次我发出cmake命令时,都会使用一个新的源目录副本来确保没有缓存问题。

最佳答案

问题出在“set(cmake_system_name generic)”行
通用平台将target_supports_shared_libs属性重写为false。如果你用android替换generic,那么它应该可以工作,尽管它会给你警告。在这种情况下,简单地使用linux作为系统名可能是更好的选择(android在技术上是linux内核的变体)。
我在试图为VxWorks平台交叉编译时也遇到了同样的问题。在我的例子中,我现在将名称设置为vxworks,并暂时忍受恼人的警告。

10-07 19:22
查看更多