Android平台CMake配置:如何引入子目录生成的头文件
你已经把JRTPLIB作为子项目集成到CMake构建流程里了,现在卡在生成头文件的路径适配问题上对吧?这里有几个实用的CMake方案帮你搞定:
优先用现代CMake的目标链接方式
你当前用add_dependencies关联了目标,但其实更推荐直接用target_link_libraries——它不仅会自动处理依赖构建顺序,还能自动引入目标声明的头文件路径。把你的配置改成这样:add_subdirectory(../third_party/JRTPLIB jrtplib) add_library(myRtspClient SHARED ${SOURCES}) # 替换add_dependencies,用PRIVATE控制依赖仅在当前目标生效 target_link_libraries(myRtspClient PRIVATE jrtplib-shared)这样CMake会自动读取
jrtplib-shared目标里的INTERFACE_INCLUDE_DIRECTORIES属性,不管头文件是在源码目录还是生成的二进制目录,都会自动加到编译的include路径中,不用手动指定。手动添加生成头文件路径(适配老版本库)
有些旧版本的库可能没正确设置目标接口属性,这时候你需要手动定位生成头文件的位置。通常JRTPLIB的生成头文件会存放在你指定的子项目二进制目录(也就是jrtplib文件夹)下的include或generated这类子目录里。你可以用CMake的目标属性来获取路径,再手动添加:add_subdirectory(../third_party/JRTPLIB jrtplib) add_library(myRtspClient SHARED ${SOURCES}) add_dependencies(myRtspClient jrtplib-shared) # 获取jrtplib-shared的二进制目录,拼接生成头文件路径 get_target_property(JRTPLIB_BINARY_DIR jrtplib-shared BINARY_DIR) target_include_directories(myRtspClient PRIVATE "${JRTPLIB_BINARY_DIR}/include" # 替换成你实际找到的生成头文件路径 "../third_party/JRTPLIB/include" # 加上源码里的基础头文件路径 )要是不确定具体路径,直接去你的build目录里的
jrtplib文件夹下找,生成的头文件一般会放在名字带include或gen的子文件夹里。补全JRTPLIB的CMake接口配置
你可以打开JRTPLIB的CMakeLists.txt,看看它有没有用target_include_directories(jrtplib-shared PUBLIC ...)声明头文件路径。如果没有的话,你可以在add_subdirectory之后手动给目标补充接口属性:add_subdirectory(../third_party/JRTPLIB jrtplib) # 给jrtplib-shared补充接口include路径 target_include_directories(jrtplib-shared INTERFACE "../third_party/JRTPLIB/include" "${CMAKE_CURRENT_BINARY_DIR}/jrtplib/include" # 生成头文件的二进制路径 ) add_library(myRtspClient SHARED ${SOURCES}) target_link_libraries(myRtspClient PRIVATE jrtplib-shared)
优先用第一种现代CMake的方式,最省心也符合行业最佳实践,大概率能直接解决你的问题。
内容的提问来源于stack exchange,提问作者PPP

