CMake 不会使用 add_executable 构建可执行文件

CMake does not build an executable with add_executable

本文关键字:executable 构建 可执行文件 add CMake      更新时间:2023-10-16

我是CMake的新手,使用CMake创建可执行文件时遇到问题。我正在尝试从单个CMakeLists.txt文件构建可执行文件和共享库。我的CMakeLists.txt如下:

cmake_minimum_required(VERSION 3.4.1)
project (TestService)
include_directories(
    src/main/cpp/
    libs/zlib/include/
)
add_library(libz SHARED IMPORTED)
set_target_properties(libz PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/libs/zlib/libs/${ANDROID_ABI}/libz.so)
find_library(log-lib log)
add_executable(
    test_utility
    src/main/cpp/test_utility.cpp
    src/main/cpp/storage.cpp
)
target_link_libraries(test_utility ${log-lib} libz)
add_library(
    processor
    SHARED
    src/main/cpp/com_example_testservice.cpp
    src/main/cpp/storage.cpp
)
target_link_libraries(processor libz ${log-lib})

但是,当我从命令行使用 android studio/gradlew 构建我的项目时,我只看到 processor.so 库被创建,test_utility可执行文件永远不会被创建。我的CMakeList.txt中哪些不正确?

答案是:它构建,只是没有打包到 apk 中,因为只会复制与模式lib*.so匹配的文件。因此,修复很容易:

add_executable(libnativebinaryname.so ...)

如果不看到实际的命令,很难说出引擎盖下发生了什么。
话虽如此,您可能正在使用仅显式构建目标processor make processor。从CMakeLists.txt可以看到processor目标没有test_utility目标作为依赖项。

要编译后者,您可以:

  • 要么使用 make ,使所有目标
  • 或运行 make test_utility ,以显式构建它

您需要将可执行文件指定为构建目标。默认情况下,Android Studio 会构建 .so 文件,但除非您指定可执行文件,否则不会构建可执行文件。这是有关该主题的文档(搜索"目标"(。

基本上,将这样的东西添加到模块的 build.gradle 文件中:

defaultConfig {
    externalNativeBuild {
        cmake {
            targets "executable_target"
        }
    }
}

您也可以将其放在产品风味下,如下所示:

productFlavors {
    chocolate {
        externalNativeBuild {
            cmake {
                targets "executable_target"
            }
        }
    }
}

如果添加任何显式构建目标,则默认情况下它将不再生成所有共享对象,而仅生成那些依赖于显式目标的对象。您可以指定多个目标来生成所有可执行文件和共享对象。此错误涵盖了改进它。