CMake : 递归的添加所有cpp文件 - 夜行过客 - 博客园
CMake : 递归的添加所有cpp文件最近在使用android studio的时候又发现了一个非常不方便的地方:
每次创建新的C++文件,都需要手动把新创建的C++文件名添加到CMakeLists.txt文件中,不然的话编辑器的顶部就会一直报:
目前我的项目结构如下:
对应的CMakeLists.txt文件如下:
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required(VERSION 3.4.1)
# Add header file path
# include_directories(src/main/cpp/include)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
add_library( # Sets the name of the library.
HaAlgorithm
# Sets the library as a shared library.
SHARED
src/main/cpp/HaAptUserTuneJNI.cpp
src/main/cpp/AndroidLog.cpp
# Algorithm
src/main/cpp/HaAlgorithm/apt_tune.cpp
src/main/cpp/HaAlgorithm/invfreqz.cpp
src/main/cpp/HaAlgorithm/main.cpp
src/main/cpp/HaAlgorithm/sort_sos.cpp
src/main/cpp/HaAlgorithm/tf2sos.cpp
src/main/cpp/HaAlgorithm/user_tune_eq.cpp
src/main/cpp/HaAlgorithm/wdrc_payload.cpp
# CommandDefine
src/main/cpp/HaCommandDefine/NoiseReductionPayload.cpp
)
# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log)
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.
target_link_libraries( # Specifies the target library.
HaAlgorithm
android
# Links the target library to the log library
# included in the NDK.
${log-lib})
可以看到,add_library 一行中已经添加了很多的cpp 文件, 有些还在第二级的子目录。
解决办法:
可以通过file指令搜索出所有后缀名为".cpp"的文件,然后添加到项目中,新的CMakeLists.txt修改如下:
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_CXX_STANDARD 11)
file(GLOB_RECURSE native_srcs src/main/cpp/*.cpp)
add_library(HaAlgorithm SHARED ${native_srcs})
target_link_libraries(
HaAlgorithm
android
log
)
重点在于标红的那一句,什么意思呢,相当于告诉CMake, 搜索当前目录以及子目录中所有的以.cpp结尾的文件,然后把它们保存到 native_srcs 变量中。这里要注意CMakeLists.txt文件的位置,我是放在项目根目录下,所以我在搜索的时候指定了前缀:src/main/cpp。
这样修改之后,以后再添加新的C++代码就不需要再修改CMake文件了,编译APK的时候CMake会自动找出符合条件的C++文件并且参与到构建当中。
美中不足的是,虽然编译最终apk的时候,新添加的文件也会被编译,但是新添加的C++文件上方还是会出现:
并且点击右边的“Sync Now” 之后还是没用!
经过反复尝试发现可以通过点击菜单栏上的“Refresh Linked C++ Projects” 让它消失。



