迁移通知
本站内容正在逐步向 https://www.weiran.ink 迁移,更新内容请到新站查找。
CMake自动拷贝配置、数据文件到程序目录
写程序不仅是写程序……
稍复杂的程序,经常需要拷贝一些配置文件、数据文件拷贝、有时候甚至是某些动态库,到可执行文件旁边或者可执行文件旁边的某个子目录。虽然一般手动做也不是很麻烦,但毕竟落了下乘。即使Visual Studio
,也可以把任意文件加入项目树,并选择“构建时拷贝到……”
这功能在CMake
中也是有的:`configure_file`
configure_file(`<input>` `<output>` [COPYONLY] [ESCAPE_QUOTES] [@ONLY] [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ]) Copies an `<input>` file to an `<output>` file and substitutes variable values referenced as @VAR@ or ${VAR} in the input file content. Each variable reference will be replaced with the current value of the variable, or the empty string if the variable is not defined.
还是挺先进的,拷贝前根据实际情况替换文本的选项都有。实际用起来也简单:configure_file(filePath.bat ${CMAKE_BINARY_DIR}/filePath.bat)
即可将filePath.bat
拷贝到编译路径下。
针对Visual Studio
,有个不大不小的麻烦:Visual Studio
编译出来的可执行文件默认并不在${CMAKE_BINARY_DIR}
指向的路径下,而在此路径的Debug
、Release
、RelWithDebInfo
等子目录下。偏偏,从Visual Studio
中点击调试或者运行的时候,程序的执行路径又变成了${CMAKE_BINARY_DIR}
指向的这个目录,而不再那几个子目录中,非常之绕。
针对这种情况,如果你要拷贝的文件是数据文件,那么直接用就好了,反正直接点击调试正好可以访问到。但如果你要拷贝的是一个bat
启动器之类,需要直接从资源管理双击的玩意儿,直接像上面那样写就有问题。以下这个比较麻烦的方法,可以严格保证把文件拷贝到Debug
、Release
、RelWithDebInfo
等子目录下:
IF(CMAKE_CONFIGURATION_TYPES) FOREACH(config ${CMAKE_CONFIGURATION_TYPES}) configure_file(filePath.bat ${CMAKE_BINARY_DIR}/${config}/filePath.bat) configure_file(iniReader.bat ${CMAKE_BINARY_DIR}/${config}/iniReader.bat) configure_file(startNXParametricServer.bat ${CMAKE_BINARY_DIR}/${config}/startNXParametricServer.bat) configure_file(serverConfig.ini ${CMAKE_BINARY_DIR}/${config}/serverConfig.ini) ELSE(CMAKE_CONFIGURATION_TYPES) configure_file(filePath.bat ${CMAKE_BINARY_DIR}/filePath.bat) configure_file(iniReader.bat ${CMAKE_BINARY_DIR}/iniReader.bat) configure_file(startNXParametricServer.bat ${CMAKE_BINARY_DIR}/startNXParametricServer.bat) configure_file(serverConfig.ini ${CMAKE_BINARY_DIR}/serverConfig.ini) ENDIF(CMAKE_CONFIGURATION_TYPES)
如果两种情况都有,上面这段就不要if-else
了,直接把所有目录各拷贝一次,总是能访问到的。这时候就体现出来CMake
的自动化优势了:你修改一个配置文件,手动拷贝的话加起来有五个地方要覆盖;但是做好了CMake
机制之后,修改配置文件之后的第一次构建,所有地方的配置文件都会被自动更新。