2

我是 CMake 的新手。我已经编译了我的项目。我有这样的结构

项目

  • SRC

    1. 测试
      此文件夹的 .cpp(所有源文件)和 CMakeLists.txt(创建静态库)
    2. 此文件夹的示例
      .cpp(所有源文件)和 CMakeLists.txt(创建静态库)
  • 包括

    1. 测试
      .h(所有头文件)
    2. 示例
      .h(所有头文件)
  • 建造

    1. CMakeLists.txt(主 CMakelist 文件)
    1. 测试(包含生成的文件)
    2. 示例(包含生成的文件)

问题是我如何复制所有静态文件,即。从测试和示例文件夹中递归地将它们放在二进制结构之外的不同文件夹中?

我的主要 CMakeLists.txt 文件:

PROJECT(copythefiles)

SET(CMAKE_CURRENT_BINARY_DIR ".")

add_subdirectory(/src/test /lib/test) # I am specifying the location where the files are to be generated
add_subdirectory(/src/example /lib/example)

ADD_CUSTOM_TARGET( a ALL COMMAND ${CMAKE_COMMAND} -E echo "\{X}" > ${CMAKE_CURRENT_BINARY_DIR}/lib/test/libtest.a )

ADD_CUSTOM_COMMAND(TARGET a POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${CMAKE_CURRENT_BINARY_DIR}/lib/test/libtest.a
        ${CMAKE_CURRENT_BINARY_DIR}/lib/libtest.a )

这会复制文件。但我有大约 20 个项目,我想递归地做。

谢谢 :)

4

1 回答 1

3

将顶级 CMakeLists.txt 文件放在项目的根目录中是正常的。如果您将 CMakeLists.txt 从“/build”移到根目录,那么您应该能够调用add_subdirectory而无需为每种情况指定二进制路径。

add_subdirectory假设您移动了 CMakeLists 文件,那么您可以在调用之前插入它:

function(MoveLib TheTarget)
  add_custom_command(TARGET ${TheTarget} POST_BUILD
                     COMMAND ${CMAKE_COMMAND} -E
                         copy $<TARGET_FILE:${TheTarget}> ${CMAKE_SOURCE_DIR}/lib)
endfunction()

execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_SOURCE_DIR}/lib)

然后,这允许您MoveLib(my_test)在库的 CMakeLists.txt 文件中添加例如相关库my_test的名称。


然后所有库的副本将在“/lib”中结束。如果您不是真的想要副本,那么您应该看看该ARCHIVE_OUTPUT_DIRECTORY属性。如果您只是添加

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib)

那么你所有的静态库都将在“/lib”中结束。不过,这里有几件事需要注意。

共享库不在ARCHIVE_OUTPUT_DIRECTORY. 共享库的详细信息在文档中ARCHIVE_OUTPUT_DIRECTORY

此外,一些生成器(例如 MSVC)将每个配置的子目录附加到指定目录,因此您最终会得到“/lib/Debug”、“/lib/Release”等。您可以通过设置配置来规避这种情况-to all 的特定版本CMAKE_ARCHIVE_OUTPUT_DIRECTORY指向${CMAKE_SOURCE_DIR}/lib

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/lib)
于 2012-10-31T21:42:52.850 回答