CMakeList配置之编译多个.cpp文件

本文介绍在使用Android Studio 2.2及更高版本进行NDK开发时遇到的.so文件缺失错误,并提供通过调整CMakeLists.txt文件来解决该问题的方法。

不说废话了,android studio2.2 以后的ndk编译引入的cmake,官方创建新的项目会有项目事例,看了一下多了一个Cmakelist.txt文件,大概了解了一下,自己新创建了.cpp文件,直接编译,果然出错了

03-14 23:07:01.886 8542-8542/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                 Process: com.chen.androidtools, PID: 8542
                                                 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.chen.androidtools-2/base.apk"],nativeLibraryDirectories=[/data/app/com.chen.androidtools-2/lib/x86, /data/app/com.chen.androidtools-2/base.apk!/lib/x86, /vendor/lib, /system/lib]]] couldn't find "libiomove-lib.so"
                                                     at java.lang.Runtime.loadLibrary(Runtime.java:367)
                                                     at java.lang.System.loadLibrary(System.java:1076)
                                                     at com.chen.utils.IoFromC.<clinit>(IoFromC.java:20)
                                                     at com.chen.androidtools.MainActivity.onCreate(MainActivity.java:103)
                                                     at android.app.Activity.performCreate(Activity.java:6237)
                                                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                     at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                     at android.os.Handler.dispatchMessage(Handler.java:102)
                                                     at android.os.Looper.loop(Looper.java:148)
                                                     at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

就是说没有找到编译的.so文件,初步猜想大概是和CMakeLists.txt有关

看了一下,google创建的模板里面有三个函数

-add_library(< name > [STATIC | SHARED | MODULE [EXCLUDE_FROM_ALL] source1 source2 … sourceN) )
- find_library
- target_link_libraries

看了以后我只对add比较有兴趣

目前百度的解决方案基本只有一个

#对应需要编译cpp的文件路径
file(GLOB native_srcs "src/main/cpp/*.cpp")

add_library( # Sets the name of the library.
             native-lib
             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             # Associated headers in the same location as their source
             # file are automatically included.
             # src/main/cpp/native-lib.cpp )
             ${native_srcs})

修改add函数的最后一个参数,将目录下所有的cpp文件全部编译.so

但是,这种感觉就像是被强奸了一样,目录下所有的全部编译,看着就难受啊,以后再分个包怎么办,还是好恶心的

所以我最终选择再次调用add_library函数

所以我选择再次调用add_library函数

最后再make project 就可以了这里写图片描述

<think>嗯,用户的问题是关于在CMakeLists.txt中使用add_executable添加多个cpp文件的方法。用户引用了三份资料,其中引用[1]展示了单个cpp文件编译成可执行文件的例子,引用[3]提到了add_executable的基本语法但没涉及多文件情况。看来用户需要具体操作方法。 用户可能正在学习CMake构建系统,遇到了多文件项目的配置问题。从ta特意强调"多个cpp文件"的表述看,应该是个实际项目需求而非理论探讨。考虑到用户引用了DEBUG模式配置和库文件创建的内容,说明项目可能涉及较复杂的结构。 需要明确告诉用户三种主流方案: 1 直接枚举文件列表是最基础直观的方式,适合少量文件 2 文件收集函数能自动匹配,避免手动维护列表 3 子目录方案适合大型模块化项目 特别要注意提醒路径问题,这是CMake新手的常见痛点。用户引用的资料中[^1]示例里没有包含路径处理,容易引发编译错误。另外链接库的指令target_link_libraries也要保持统一,这点在用户给的示例[^1]末尾出现过。 用户似乎对工程结构有基本认知,可以适当推荐模块化方案。不过引用资料里没有涉及aux_source_directory函数,需要完整说明语法。最后应该提醒最佳实践:中大型项目优先选用方案二或三。 安全方面要强调避免硬编码路径,这点在引用[2]的"与其他指令配合"里隐含提到过。最后生成的参考问题要覆盖用户可能遇到的延伸需求,比如如何过滤文件或处理依赖关系。 </think>在 CMakeLists.txt 中使用 `add_executable` 添加多个 C++ 源文件主要有以下方法: ### 方法 1:直接列举所有源文件 ```cmake add_executable(my_target main.cpp src/utility.cpp src/algorithm.cpp include/math_functions.cpp ) ``` * **说明**:直接在 `add_executable` 的参数中列出所有 `.cpp` 文件路径(相对路径或绝对路径)。 * **适用场景**:源文件数量较少或路径明确的情况[^1][^3]。 ### 方法 2:使用变量收集源文件 ```cmake # 定义源文件列表变量 set(MY_SOURCES main.cpp src/utility.cpp src/algorithm.cpp include/math_functions.cpp ) add_executable(my_target ${MY_SOURCES}) ``` * **优势**: - 便于集中管理文件列表 - 支持后续通过 `list(APPEND MY_SOURCES new_file.cpp)` 动态扩展 * **最佳实践**:中大型项目的首选方案[^1][^3]。 ### 方法 3:自动收集目录源文件 ```cmake # 自动收集当前目录所有.cpp文件 aux_source_directory(. DIR_SRCS) # 收集子目录文件 aux_source_directory(src SRC_SRCS) add_executable(my_target ${DIR_SRCS} ${SRC_SRCS} ) ``` * **注意**: - 会包含目录下**所有**符合条件的文件 - 需确保目录中无冗余文件 - 新添加文件时需重新生成构建系统 ### 方法 4:模块化子目录(大型项目推荐) ```cmake # 主CMakeLists.txt add_executable(my_target main.cpp) add_subdirectory(src) # 添加子模块 # src/CMakeLists.txt target_sources(my_target PRIVATE utility.cpp algorithm.cpp ) ``` * **优势**: - 模块化程度高 - 支持分目录编译 - 便于代码重用[^2] ### 关键注意事项: 1. **路径处理**: ```cmake # 推荐显式指定路径 set(SRC_DIR src) set(SRCS ${SRC_DIR}/file1.cpp ${SRC_DIR}/file2.cpp ) ``` 2. **文件通配符**(谨慎使用): ```cmake file(GLOB SRCS "src/*.cpp") # 可能漏掉新增文件 ``` 3. **链接库文件**: ```cmake target_link_libraries(my_target PRIVATE calculate_shared # 引用[1]中的库链接方式 ) ``` > **最佳实践建议**:优先使用方法2(变量集合),超过10个文件时采用方法4(模块化)。始终避免使用通配符以保证构建可靠性[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值