无法使用CMake从其他文件夹添加源文件

时间:2020-06-21 18:20:41

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

当我尝试在CMake中添加.cpp和.h文件时出现错误。同一文件夹中的头文件正在工作。 我正在使用Android Studio 3.0。 错误是:

CMake Error at CMakeLists.txt:26 (add_library):
Cannot find source file:
libs/Superpowered/AndroidIO/SuperpoweredAndroidAudioIO.cpp
Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
.hxx .in .txx

CMake的路径是:

\app\src\main\jni\CMakeLists 

.cpp和.h文件的路径是:

libs/Superpowered/AndroidIO/SuperpoweredAndroidAudioIO

CMake文件为:

cmake_minimum_required(VERSION 3.4.1)

set(
        PATH_TO_SUPERPOWERED "libs/Superpowered/AndroidIO/SuperpoweredAndroidAudioIO"
        CACHE STRING ""
)

message(${ANDROID_ABI})

file(GLOB CPP_FILES
        "*.h"
        "*.cpp")

add_executable(CPPFILES ${CPP_FILES})

add_library(
        libs
        SHARED
        libs/Superpowered/AndroidIO/SuperpoweredAndroidAudioIO.cpp
)

target_include_directories(libs PRIVATE
        libs/Superpowered/AndroidIO/SuperpoweredAndroidAudioIO
        )
include_directories(src/main/jni)

include_directories(${PATH_TO_SUPERPOWERED})

target_link_libraries(
        libs
        log
        android
        OpenSLES
        ${PATH_TO_SUPERPOWERED}/libSuperpoweredAndroid.a
)

有什么办法解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

如前所述,用于引用库源文件的路径似乎不正确。您提到的库资源在这里:

libs/Superpowered/AndroidIO/SuperpoweredAndroidAudioIO

因此,库源文件SuperpoweredAndroidAudioIO.cpp的完整路径应为:

libs/Superpowered/AndroidIO/SuperpoweredAndroidAudioIO/SuperpoweredAndroidAudioIO.cpp

更好的是,使用您在CMake变量PATH_TO_SUPERPOWERED已经定义的路径来引用源文件。如果确实是同一路径,请保存一些输入内容,并尽可能使用变量引用它:

cmake_minimum_required(VERSION 3.4.1)

set(
        PATH_TO_SUPERPOWERED "libs/Superpowered/AndroidIO/SuperpoweredAndroidAudioIO"
        CACHE STRING ""
)

message(${ANDROID_ABI})

file(GLOB CPP_FILES
        "*.h"
        "*.cpp")

add_executable(CPPFILES ${CPP_FILES})

# Reference the source file using the path defined in your CMake variable.
add_library(
        libs
        SHARED
        ${PATH_TO_SUPERPOWERED}/SuperpoweredAndroidAudioIO.cpp
)

# You can remove this call because it is redundant with 
# the 'include_directories' call below.
target_include_directories(libs PRIVATE
        libs/Superpowered/AndroidIO/SuperpoweredAndroidAudioIO
        )

# You can merge the two 'include_directories' calls into one.
include_directories(
    src/main/jni 
    ${PATH_TO_SUPERPOWERED}
)

target_link_libraries(
        libs
        log
        android
        OpenSLES
        ${PATH_TO_SUPERPOWERED}/libSuperpoweredAndroid.a
)
相关问题