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

Cannot add source file from different folder using CMake

本文关键字:其他 文件夹 添加 源文件 CMake      更新时间:2023-10-16

当我尝试在 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 的路径是:

appsrcmainjniCMakeLists 

.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
)

知道如何解决这个问题吗?

如注释所示,用于引用库源文件的路径看起来不正确。你提到图书馆资源在这里:

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
)