Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake:文件未复制_Cmake_Copy_Makefile_Fortran_Fortran90 - Fatal编程技术网

Cmake:文件未复制

Cmake:文件未复制,cmake,copy,makefile,fortran,fortran90,Cmake,Copy,Makefile,Fortran,Fortran90,我在一个用Fortran编写的大项目中工作。我们在CMake的帮助下构建它。我需要将函数“test_tsmparser.F90”所需的文件“plane.tsm”复制到构建目录中的相应位置。我已经为另一个函数做过一次,但现在它不工作了 对应的CMakeList.txt: include_directories(${CMAKE_BINARY_DIR}/src) include_directories(${CMAKE_BINARY_DIR}/test) include_directories(${CM

我在一个用Fortran编写的大项目中工作。我们在CMake的帮助下构建它。我需要将函数“test_tsmparser.F90”所需的文件“plane.tsm”复制到构建目录中的相应位置。我已经为另一个函数做过一次,但现在它不工作了

对应的CMakeList.txt:

include_directories(${CMAKE_BINARY_DIR}/src)
include_directories(${CMAKE_BINARY_DIR}/test)
include_directories(${CMAKE_BINARY_DIR}/utils/xml/sax)  

add_executable(test_tsmparser test_tsmparser.F90)

target_link_libraries(test_tsmparser testlib sax)

function (cm_export_file FILE DEST)
  if (NOT TARGET export-files)
    add_custom_target(export-files ALL COMMENT "Exporting files into build tree")
  endif (NOT TARGET export-files)
  get_filename_component(FILENAME "${FILE}" NAME)
  add_custom_command(TARGET export-files COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${FILE}" "${CMAKE_CURRENT_BINARY_DIR}/${DEST}/${FILENAME}")
  install(FILES "${FILE}" DESTINATION "${DEST}")
endfunction (cm_export_file)

cm_export_file("plane.tsm" "./")
奇怪的是,创建了可执行的test_tsmparser,但没有复制文件“plane.tsm”。这意味着什么

可能问题是之前另一个目标调用了完全相同的函数


如果您需要更多信息,请告诉我,因为我不知道还有什么相关信息。

在创建应生成输出的自定义命令时,您应该使用
add_custom_command()
output
签名,而不是
目标:

function (cm_export_file FILE DEST)
  get_filename_component(FILENAME "${FILE}" NAME)
  add_custom_command(
    OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${DEST}/${FILENAME}"
    DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${FILE}"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${FILE}" "${CMAKE_CURRENT_BINARY_DIR}/${DEST}/${FILENAME}"
  )
  set(copiedFiles ${copiedFiles} "${CMAKE_CURRENT_BINARY_DIR}/${DEST}/${FILENAME}" PARENT_SCOPE)
  install(FILES "${FILE}" DESTINATION "${DEST}")
endfunction (cm_export_file)
然后,完成所有调用后,创建将驱动命令的自定义目标:

add_custom_target(
  export-files ALL
  DEPENDS ${copiedFiles}
  COMMENT "Exporting files into build tree"
)

看来我只需要更改这两个CMakeLists的目标名称


谢谢您的帮助。

您能否澄清目标
导出文件的意图?它是否应该在构建时复制文件,而不依赖于其他目标?是的,它应该只将我需要的文件复制到相应的目录中。我想问题是这个目标已经为另一个复制而构建,但我不知道如何解决它。谢谢你的帮助。那么我应该在哪个文件和哪个点添加自定义目标导出文件?@TarasKucherenko在调用
cm\u export\u file()
之后,它必须位于同一个CMakeLists.txt中。我需要为不同的文件夹复制一个文件,所以我在不同的CMakeList文件中进行复制。现在我得到了下一个错误:test/cases/tsm/CMakeLists.txt:28(add_custom_target):add_custom_target无法创建目标“导出文件”,因为已经存在另一个同名的目标。现有目标是在源目录“/home/tk207547/src/splinelib/test/cases/iges”中创建的自定义目标。有关更多详细信息,请参阅政策CMP0002的文档。@TarasKucherenko好的,那么您可以尝试回到您最初的想法,但添加一个必需的
POST\u BUILD
PRE\u BUILD
PRE\u LINK
(您缺少的链接)。我在行中添加了单词PRE\u BUILD:add\u custom\u命令(目标导出文件…)。仍然只是这个函数的第一个调用复制了一个文件,而第二个并没有执行它的转换,但我遇到了类似的问题,名称的更改也有帮助。谢谢