我正在尝试使用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_LIBS
之后正在重置属性PROJECT(OpenAL)
。我已经阅读了PROJECT
,TARGET_SUPPORTS_SHARED_LIBS
的文档并包含了一个工具链文件,但没有找到任何明确提到重置目标工具链变量的内容。
CMake是否有一些规则导致此变量在工具链文件和CMakeLists.txt处理之间重置,或者可能在PROJECT
命令之前和之后重置?
我正在使用CMake 2.8.12.2。每次我发出CMake命令时,我都会使用源目录的新副本来确保没有缓存问题。
答案 0 :(得分:0)
问题在于“SET(CMAKE_SYSTEM_NAME Generic)”行
Generic平台会将TARGET_SUPPORTS_SHARED_LIBS属性覆盖为false。如果在这种情况下将Generic替换为Android,它应该可以工作,但它会给你警告。在这种情况下,简单地使用Linux作为系统名称可能是更好的选择(Android在技术上是Linux内核的变体)。
我在尝试为VxWorks平台进行交叉编译时遇到了同样的问题。就我而言,我现在正在将名称设置为VxWorks,并且现在正处于恼人的警告状态。