# CMake自动拷贝配置、数据文件到程序目录 写程序不仅是写程序…… 稍复杂的程序,经常需要拷贝一些配置文件、数据文件拷贝、有时候甚至是某些动态库,到可执行文件旁边或者可执行文件旁边的某个子目录。虽然一般手动做也不是很麻烦,但毕竟落了下乘。即使`Visual Studio`,也可以把任意文件加入项目树,并选择“构建时拷贝到……” 这功能在`CMake`中也是有的:[`configure_file`](https://cmake.org/cmake/help/v3.10/command/configure_file.html) ``` configure_file(`` `` [COPYONLY] [ESCAPE_QUOTES] [@ONLY] [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ]) Copies an `` file to an `` 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`机制之后,修改配置文件之后的第一次构建,所有地方的配置文件都会被自动更新。