如何配置CMake使pybind11模块无需make install输出到指定目录
解决方法
- 之前配置不生效的核心原因是
RUNTIME_OUTPUT_DIRECTORY仅适用于可执行文件,pybind11生成的Python扩展属于MODULE类型动态库:- Linux/macOS下后缀为
.so/.dylib的扩展,对应CMake的LIBRARY输出目录属性 - Windows下后缀为
.pyd的扩展,对应CMake的RUNTIME输出目录属性
- Linux/macOS下后缀为
install配置仅在执行安装步骤时生效,编译阶段不会触发,因此无法实现编译后直接输出到目标目录的需求
通用跨平台配置方案
直接替换你原有的代码即可:
pybind11_add_module(MyModule MyFile.cpp) # 同时配置两类输出目录,适配全平台 set_target_properties(MyModule PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${BUILD_DIR}" RUNTIME_OUTPUT_DIRECTORY "${BUILD_DIR}" )
多配置生成器适配(Visual Studio、Xcode等)
这类生成器默认会在输出路径下自动追加Debug/Release子目录,要彻底屏蔽这个行为,使用以下配置:
pybind11_add_module(MyModule MyFile.cpp) set_target_properties(MyModule PROPERTIES # 适配所有构建类型,直接输出到BUILD_DIR根目录 LIBRARY_OUTPUT_DIRECTORY_DEBUG "${BUILD_DIR}" LIBRARY_OUTPUT_DIRECTORY_RELEASE "${BUILD_DIR}" LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_DIR}" LIBRARY_OUTPUT_DIRECTORY_MINSIZEREL "${BUILD_DIR}" RUNTIME_OUTPUT_DIRECTORY_DEBUG "${BUILD_DIR}" RUNTIME_OUTPUT_DIRECTORY_RELEASE "${BUILD_DIR}" RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_DIR}" RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${BUILD_DIR}" )
修改后重新生成构建目录再编译,生成的扩展文件就会直接输出到你指定的BUILD_DIR路径下,不需要额外执行安装步骤,也不会在当前目录残留文件。
内容的提问来源于stack exchange,提问作者Binu
相关产品推荐
相关产品推荐

