Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/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 - Fatal编程技术网

如何重新加载cmake目标

如何重新加载cmake目标,cmake,Cmake,下面是我的场景。我有一个顶级CMakeList.txt和另外两个内部CMakeList.txt。在顶级cmake中,我有3个自定义目标,分别是复制、构建、复制和构建。As name指定make copy将源目录(即dir1、dir2)复制到${CMAKE_source_DIR}。makebuild创建lib和可执行文件。制作副本和生成副本+生成 正在运行cmake。。从生成目录成功完成 如果我运行makecopyandbuild,它将复制到${CMAKE_SOURCE_DIR},但在生成时它显示

下面是我的场景。我有一个顶级CMakeList.txt和另外两个内部CMakeList.txt。在顶级cmake中,我有3个自定义目标,分别是复制、构建、复制和构建。As name指定make copy将源目录(即dir1、dir2)复制到${CMAKE_source_DIR}。makebuild创建lib和可执行文件。制作副本和生成副本+生成

正在运行cmake。。从生成目录成功完成

如果我运行makecopyandbuild,它将复制到${CMAKE_SOURCE_DIR},但在生成时它显示错误

No rule to make target `dir1/libmylib.so', needed by `CMaketargetdbuild'.  Stop
我的项目 dir1 CMakeLists.txt dir2 CMakeLists.txt CMakeLists.txt 如果我按照下面的顺序执行命令,它就会工作

克马克。。 复制并构建 克马克。。 建造 我的要求是,它应该在不运行cmake的情况下工作,并以copyandbuild的形式再次生成,以完成相同的工作

顶级CMakeLists.txt:

  cmake_minimum_required(VERSION 2.6)

  cmake_minimum_required(VERSION 2.6)
  set(RE_BUILD make rebuild_cache)
  set(OUTPUT_DIR ${CMAKE_SOURCE_DIR}/../)


  if(EXISTS ${CMAKE_SOURCE_DIR}/dir1)
  message(WARNING "Found dir1 dir")
  add_subdirectory(dir1 EXCLUDE_FROM_ALL)
  else()
  message(WARNING "Couldn't find dir1 directory ")
  endif()


  if(EXISTS ${CMAKE_SOURCE_DIR}/dir2)
  add_subdirectory(dir2 EXCLUDE_FROM_ALL)
  else()
  message(WARNING "Couldn't find dir2 directory")
  endif()

  set(MOVE_LIB_COMMAND mv src/myapp . && mv dir1/mylib .)
  set(COPY_COMMAND cp -r ../sourceCode1 ../dir1 && cp -r ../sourceCode2 ../dir2)

  set(CLEAN_DIR1_COMMAND cmake -E remove_directory ${CMAKE_SOURCE_DIR}/dir1)
  set(CLEAN_DIR2_COMMAND cmake -E remove_directory ${CMAKE_SOURCE_DIR}/dir2)

  set(SET_SLEEP sync)

  #Copy command
  add_custom_target(
  copy ${COPY_COMMAND}
  COMMAND ${RE_BUILD} 
  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  )
  #Compilation
  add_custom_target(
  build
  COMMAND ${MOVE_LIB_COMMAND}
  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  DEPENDS mylib myapp
  )

  #copy and compile
  add_custom_target(
  copyandbuild  
  COMMAND ${MOVE_LIB_COMMAND} 
  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  DEPENDS copy mylib myapp
  )

  add_custom_command(TARGET copy POST_BUILD
               COMMAND ${SET_SLEEP} 
  )
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")
dir1 CMake是:

cmake_minimum_required(VERSION 2.6)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")


include_directories(
${MY_APP_INCLUDE_DIRS}
)

link_directories(
${MY_APP_LIBDIR}
)

add_library(mylib
SHARED 
com/*.cpp
)
target_link_libraries(mylib myapp_lib)
cmake_minimum_required(VERSION 2.6)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")
include_directories(
${MY_APP_INCLUDE_DIRS}
)
link_directories(
${MY_APP_LIBDIR}
)
dir2 CMake是:

cmake_minimum_required(VERSION 2.6)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")


include_directories(
${MY_APP_INCLUDE_DIRS}
)

link_directories(
${MY_APP_LIBDIR}
)

add_library(mylib
SHARED 
com/*.cpp
)
target_link_libraries(mylib myapp_lib)
cmake_minimum_required(VERSION 2.6)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")
include_directories(
${MY_APP_INCLUDE_DIRS}
)
link_directories(
${MY_APP_LIBDIR}
)

您使用CMake的方式会妨碍其正常功能。通过在许多地方显式调用shell命令,当您可以使用CMake内置功能时,您就剥夺了CMake用于构建程序的任何上下文。此外,在CMake中使用诸如*.cpp之类的通配符被认为是不好的做法。而且您有许多重复语句,不需要cmake_minimum_required或设置编译器标志,而只需要在顶层设置

简而言之,顶级的CMakeLists.txt应该更像这样:

cmake_minimum_required(VERSION 2.6)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")

add_subdirectory(dir1 EXCLUDE_FROM_ALL)
您不需要复制源文件,只需从它们所在的位置构建它们,例如,您的dir1/CMakeLists.txt可能是:

add_library(mylib
  SHARED
  sourceCode1/mylib.cpp
)

保持简单。让它工作起来。如果需要添加缺少的功能,请提问。

能否以精简的方式共享CmakeLists.txt的内容?请清理代码段:使变量保持一致,例如,您设置了变量RE_BUILD_命令,但使用RE_BUILD,删除代码段中未使用的变量定义。据我从代码中了解,您希望的Dependes选项添加来自其他目标的依赖项。但它实际上添加了来自文件的依赖项。要在目标之间添加依赖项,请使用命令。谢谢!对于你的建议,实际上我在这里只是为了简单的理解而使用复制,将从一些外部应用程序实时生成dir1和dir2。生成后,我的copyandbuild命令应该能够编译生成的代码。@venkat2010:然后您应该将问题重新格式化为一个完全有效但最小的示例。由于我们没有您的代码生成器,您可以使用一个简单的bash脚本来编写.cpp文件或其他文件。