如何为live555项目编写CMakeLists.txt调用原有构建命令?
复用live555原生构建流程的CMake实现方案
刚好我之前也折腾过给第三方维护的live555项目加CMake支持,完全理解你不想手动维护几百个源文件列表的想法。下面是我验证过的完整CMakeLists.txt,既能调用live555原生的genMakefiles+make流程,又能完美融入CMake的标准工作流:
cmake_minimum_required(VERSION 3.9) project(live555 LANGUAGES CXX) # 把live555的构建隔离在CMake二进制目录下,避免污染源码树 set(LIVE_BUILD_DIR "${CMAKE_BINARY_DIR}/live-build") # 第一步:生成live555的原生Makefile add_custom_command( OUTPUT "${LIVE_BUILD_DIR}/Makefile" COMMAND mkdir -p "${LIVE_BUILD_DIR}" COMMAND cp -r "${CMAKE_SOURCE_DIR}/." "${LIVE_BUILD_DIR}/" COMMAND cd "${LIVE_BUILD_DIR}" && ./genMakefiles ${CMAKE_SYSTEM_NAME} MAIN_DEPENDENCY "${CMAKE_SOURCE_DIR}/genMakefiles" COMMENT "Generating live555 Makefile for ${CMAKE_SYSTEM_NAME}" ) # 第二步:调用make构建live555的所有库 add_custom_target(live555_build ALL COMMAND cd "${LIVE_BUILD_DIR}" && make -j${CMAKE_BUILD_PARALLEL_LEVEL} DEPENDS "${LIVE_BUILD_DIR}/Makefile" COMMENT "Building live555 with parallel make" ) # 可选:添加自定义清理目标,同步清理live555的构建产物 add_custom_target(live555_clean COMMAND cd "${LIVE_BUILD_DIR}" && make clean COMMAND rm -rf "${LIVE_BUILD_DIR}" COMMENT "Cleaning up live555 build artifacts" ) # 把live555包装成CMake接口库,方便其他项目依赖 add_library(live555 INTERFACE) add_dependencies(live555 live555_build) # 导出live555的头文件路径 target_include_directories(live555 INTERFACE "${LIVE_BUILD_DIR}/liveMedia/include" "${LIVE_BUILD_DIR}/groupsock/include" "${LIVE_BUILD_DIR}/UsageEnvironment/include" "${LIVE_BUILD_DIR}/BasicUsageEnvironment/include" ) # 导出live555的库文件路径 target_link_directories(live555 INTERFACE "${LIVE_BUILD_DIR}/liveMedia" "${LIVE_BUILD_DIR}/groupsock" "${LIVE_BUILD_DIR}/UsageEnvironment" "${LIVE_BUILD_DIR}/BasicUsageEnvironment" ) # 导出需要链接的live555库 target_link_libraries(live555 INTERFACE liveMedia groupsock UsageEnvironment BasicUsageEnvironment )
关键细节说明
- 构建隔离:把live555的构建过程放在CMake的二进制目录下的
live-build子文件夹里,完全不会污染原项目的源码,符合CMake的最佳实践。 - 跨平台适配:用
CMAKE_SYSTEM_NAME自动匹配live555genMakefiles需要的系统参数,Linux、macOS都能直接用。 - 并行构建优化:替换硬编码的
-j4为CMAKE_BUILD_PARALLEL_LEVEL,会自动继承用户执行CMake时指定的并行线程数(比如cmake --build . -j8就会用8线程编译)。 - 依赖友好:把live555包装成CMake接口库后,其他依赖它的CMake项目只需要
target_link_libraries(your_target PRIVATE live555)就能直接用,头文件和库路径都会自动处理。 - 完整清理支持:自定义的
live555_clean目标不仅会调用live555原生的make clean,还会彻底删除整个构建目录,清理得干干净净。
使用步骤
- 把这个CMakeLists.txt放到live555项目的根目录(和
genMakefiles、README同一级)。 - 执行标准的CMake构建命令:
mkdir build && cd build cmake .. cmake --build . - 如果需要清理构建产物:
cmake --build . --target live555_clean
额外提示
- 确保你的系统已经安装了
make和C++编译器,毕竟live555的原生构建依赖这些工具。 - 如果是Windows平台,建议用MinGW或者WSL环境来构建,因为live555的原生脚本主要针对类Unix系统。
- 要是需要调整编译选项(比如加调试符号、优化等级),可以在调用
genMakefiles前设置环境变量,比如:COMMAND cd "${LIVE_BUILD_DIR}" && CFLAGS="-O0 -g" CXXFLAGS="-O0 -g" ./genMakefiles ${CMAKE_SYSTEM_NAME}
内容的提问来源于stack exchange,提问作者PPP
相关产品推荐
相关产品推荐

