【问题标题】:CMake does not build an executable with add_executableCMake 不使用 add_executable 构建可执行文件
【发布时间】:2017-11-12 01:05:39
【问题描述】:

我是 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 可执行文件。我的 CMakeLists.txt 中有什么不正确的地方?

【问题讨论】:

  • processor 和 test_utility 不相关,它们只共享 storage.cpp 文件。我想创建一个可执行的 test_utility 和一个共享库 processor.so。我在哪里运行 make test_utility?

标签: android c++ android-studio cmake executable


【解决方案1】:

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

add_executable(libnativebinaryname.so ...)

【讨论】:

  • 注意:如果您直接执行二进制文件,您可能还应该使用android:installLocation="internalOnly"
【解决方案2】:

如果没有看到实际的命令,很难说出幕后发生的事情。
话虽如此,您可能正在使用make processor,它仅显式构建processor 目标。从您的CMakeLists.txt 中,您可以看到processor 目标没有test_utility 目标作为依赖项。

要编译后者,您可以:

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

【讨论】:

  • processor 和 test_utility 不相关,它们只共享 storage.cpp 文件。我想创建一个可执行的 test_utility 和一个共享库 processor.so。我在哪里运行 make test_utility?
  • 从命令行或通过将其作为目标添加到您的 gradle 文件。由你决定。为了确定这是问题所在,我会先尝试从命令行运行它。
  • 上面写着“make: *** No rule to make target `license_storage_utility'. Stop.”,那么 processor.so 是如何创建的呢?
  • 我正在使用 gradlew clean build 来生成我的 apk 和 .so 文件。我不明白在哪里指定目标。你能解释一下 test_utility 的目标在哪里需要提到吗?它在 build.gradle 中吗?
【解决方案3】:

您需要将可执行文件指定为构建目标。 Android Studio 默认构建 .so 文件,但除非您指定它们,否则不会构建可执行文件。 Here's the documentation on the topic(搜索“目标”)。

基本上,将类似这样的内容添加到模块的 build.gradle 文件中:

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

您也可以将其置于这样的产品风味之下:

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

如果您添加任何显式构建目标,默认情况下它将不再构建所有共享对象,只会构建显式目标的依赖项。您可以指定多个目标来构建所有可执行文件和共享对象。 This bug covers improving that.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    相关资源
    最近更新 更多