如何在CMake主项目中构建PortAudio子项目并复制portaudio.lib文件?
如何在CMake主项目中自动构建PortAudio并复制库文件
问题描述
我正在开发一个依赖PortAudio库的CMake项目,PortAudio位于portaudio子目录中。根据PortAudio文档,Windows上构建PortAudio的命令是:
cmake {portaudio path} -G "Visual Studio 14 2015 Win64" cmake --build . --config Release
现在需要在主项目的CMakeLists.txt中实现自动构建PortAudio,并将生成的portaudio.lib复制到目标目录。
我之前尝试的代码:
add_subdirectory(portaudio) configure_file(portaudio/Release/portaudio.lib portaudio.lib COPYONLY)
但运行cmake .时会报错,因为configure_file在CMake配置阶段就尝试复制文件,此时库还未生成:
CMake Error: File C:/src/libs/portaudio/Debug/portaudio.lib does not exist. CMake Error at CMakeLists.txt:2 (configure_file): configure_file Problem configuring file
添加VS版本的-G选项也会出现相同错误。
解决方案
核心问题是configure_file属于CMake配置阶段的命令,而PortAudio的库文件是在构建阶段才生成的,因此需要用构建阶段的命令来完成复制操作。以下是两种可靠的实现方式:
方式一:绑定主项目目标(推荐)
通过add_custom_command将复制操作绑定到你的主项目目标,确保在主目标构建完成后自动复制库文件:
# 引入PortAudio子项目,CMake会自动处理其构建流程 add_subdirectory(portaudio) # 假设你的主项目目标是可执行文件MyTarget(根据实际情况修改) add_executable(MyTarget main.cpp) # 链接PortAudio目标,确保PortAudio先于主目标构建 target_link_libraries(MyTarget PRIVATE portaudio) # 添加构建后复制命令 add_custom_command( TARGET MyTarget POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:portaudio> $<TARGET_FILE_DIR:MyTarget> COMMENT "Copying PortAudio library to target directory..." )
关键细节
$<TARGET_FILE:portaudio>:CMake生成器表达式,自动根据当前构建配置(Debug/Release)获取PortAudio库的完整路径,无需手动指定目录。$<TARGET_FILE_DIR:MyTarget>:自动获取主项目目标的输出目录,保证库文件复制到正确位置。POST_BUILD:指定命令在主目标构建完成后执行,此时PortAudio库已生成。copy_if_different:仅当源文件与目标文件存在差异时才复制,避免重复操作。
方式二:独立自定义目标
如果不需要绑定到具体主目标,可以创建一个独立的自定义目标,确保PortAudio构建完成后执行复制:
add_subdirectory(portaudio) add_custom_target(copy_portaudio_lib ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:portaudio> ${CMAKE_BINARY_DIR}/your/target/directory # 替换为你的目标目录 DEPENDS portaudio COMMENT "Copying PortAudio library..." )
ALL:表示该目标会在默认构建流程中自动执行。DEPENDS portaudio:强制PortAudio构建完成后才执行复制操作。
内容的提问来源于stack exchange,提问作者Yaakov Schectman
相关产品推荐
相关产品推荐

