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}指向的路径下,而在此路径的DebugReleaseRelWithDebInfo等子目录下。偏偏,从Visual Studio中点击调试或者运行的时候,程序的执行路径又变成了${CMAKE_BINARY_DIR}指向的这个目录,而不再那几个子目录中,非常之绕。

针对这种情况,如果你要拷贝的文件是数据文件,那么直接用就好了,反正直接点击调试正好可以访问到。但如果你要拷贝的是一个bat启动器之类,需要直接从资源管理双击的玩意儿,直接像上面那样写就有问题。以下这个比较麻烦的方法,可以严格保证把文件拷贝到DebugReleaseRelWithDebInfo等子目录下:

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机制之后,修改配置文件之后的第一次构建,所有地方的配置文件都会被自动更新。

  • 最后更改: 2019/05/27 13:03