cmake install命令无法覆盖同名文件

1. 问题记录

  • 我有两个同名文件test.txt,它们内容不同,但时间戳相同(文件属性中的修改时间相同)
    在这里插入图片描述

  • 我希望在cmake中利用install命令,将${PATH_SRC}/test.txt替换${PATH_DES}/tree/test.txt

     install(FILES ${PATH_SRC}/test.txt DESTINATION ${PATH_DES}/tree)
    
  • 结果无法成功替换

2. 原因排查

  • 在cmake的规则里,对于同名文件,如果时间戳相同,则会忽略复制,所以替换不生效

3. 解决方案

  • 方案1: 将原始目录copy到${PATH_DES}/tree时,不要复制test.txt,再将新的test.txt复制到${PATH_DES}/tree

    install(DIRECTORY ./tree DESTINATION ${PATH_DES}/tree
          PATTERN "test.txt" EXCLUDE)
    install(FILES ${PATH_SRC}/test.txt DESTINATION ${PATH_DES}/tree)
    
  • 方案2: 将${PATH_DES}/tree中原本的test.txt删除,再将新的test.txt复制到${PATH_DES}/tree

    install(CODE "file(REMOVE ${PATH_DES}/tree/test.txt)")
    install(FILES ${PATH_SRC}/test.txt DESTINATION ${PATH_DES}/tree)
    
  • 方案3: 创建一个custom make 目标

    add_custom_target(CopyTask
      COMMAND ${CMAKE_COMMAND} -E copy ${PATH_SRC}/test.txt ${PATH_DES}/tree/test.txt)
    
    # 运行上述CMakeList.txt文件
    mkdir build && cd build
    cmake ..
    make CopyTask
    
  • 附上:cmake官方文档

CMake中,构建静态库通常涉及以下几个步骤[^2]: 1. **使用ADD_LIBRARY**:通过`ADD_LIBRARY(<target_name> STATIC <source_files>)`命令创建静态库,其中`<target_name>`是你给库指定的名字,`STATIC`表示静态链接,`<source_files>`是包含库功能的源文件列表。 ```cmake ADD_LIBRARY(my_library STATIC src1.cpp src2.cpp) ``` 2. **设置目标属性**:有时,你可能需要同时构建动态库和静态库,这时可以使用`SET_TARGET_PROPERTIES`。例如,设置同名动态库和静态库的版本信息: ```cmake SET_TARGET_PROPERTIES(my_library PROPERTIES VERSION 1.0.0 SOVERSION 1) ``` 3. **安装**:当项目构建完成后,可以使用`INSTALL(TARGETS <target> DESTINATION <install_path>)`命令安装库,包括头文件和库文件: ```cmake INSTALL(FILES my_library.h DESTINATION include) INSTALL(TARGETS my_library RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) ``` 4. **搜索路径**:使用`INCLUDE_DIRECTORIES`和`LINK_DIRECTORIES`添加非标准的头文件和库文件搜索路径,确保编译器能找到它们: ```cmake INCLUDE_DIRECTORIES(/path/to/headers) LINK_DIRECTORIES(/path/to/libraries) ``` 5. **链接**:通过`TARGET_LINK_LIBRARIES`连接到其他库: ```cmake TARGET_LINK_LIBRARIES(my_library other_library) ``` 6. **编译条件和平台判断**:CMake允许你根据编译条件和平台选择不同的构建行为,这部分未在此详述,但它是CMake高级用法的一部分。 记住,每次更改CMakeLists.txt文件后,都需要运行`cmake`或`cmake-gui`重新配置项目。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值