CMake 通配符用于TARGET_OBJECTS

CMake Wildcard for TARGET_OBJECTS

本文关键字:OBJECTS TARGET 用于 通配符 CMake      更新时间:2023-10-16

我有以下目录结构

-  CMakeLists.txt
-  include
    -  a.hh
-  lib
    -  CMakeLists.txt
    -  a.cc
-  src
    -  CMakeLists.txt
    -  main.cc
-  test
    -  CMakeLists.txt
    -  test.cc

我正在使用CMake编译 test.cc 使用命令

add_executable(test test.cc $<TARGET_OBJECTS:A>)

并且目标文件A.o编译为

add_library(A OBJECT A.cc)

但是$<TARGET_OBJECTS:A>命令很快就会变得丑陋。有没有办法告诉 CMake 将所有.o文件包含在 lib 文件夹中以链接所有内容?

将我的评论变成答案

没有像通配符这样的内置语法来简化add_executable(test test.cc $<TARGET_OBJECTS:A>)命令。

实际上 - 为了提高在我当前项目中处理对象库的便利性 - 我已经完全修改了我的 CMake 版本的源代码,以扩展target_link_libraries()以接受对象库,就像它接受静态或共享库一样。

但是还有其他方法可以帮助您处理大量对象库:

    您可以将对象库
  1. 分组为中间静态库(但这在某种程度上否定了使用对象库的效果):

    add_library(A OBJECT a.cc)
    add_library(B OBJECT b.cc)
    add_library(AB $<TARGET_OBJECTS:A> $<TARGET_OBJECTS:B>) 
    
  2. 您可以"扩展"add_executable()的功能,例如使用以下功能:

    function(my_add_executable _target)
        foreach(_source IN ITEMS ${ARGN})
            if (NOT TARGET "${_source}")
                list(APPEND _source_list "${_source}")
            else()
                get_target_property(_type "${_source}" TYPE)
                if (_type STREQUAL "OBJECT_LIBRARY")
                    list(APPEND _source_list "$<TARGET_OBJECTS:${_source}>")
                else()
                    message(SEND_ERROR "my_add_executable: '${_source}' given as parameter is not a object-library target.")
                endif()
            endif()
        endforeach()
        add_executable(${_target} ${_source_list})
    endfunction(my_add_executable)
    

    然后,您可以将源文件与对象库的名称混合在一起。为了防止混淆,我建议使用更具描述性的对象库名称(例如,通过添加"Objs"后缀):

    add_library(AObjs OBJECT a.cc)
    ...
    my_add_executable(testA test.cc AObjs)
    

引用

  • CMake 属性和扩展生成器表达式