CMake静态库优化

也许每个人都像永恒一样,我们每个人都不想等待很长时间才能完成项目组装。如果工作时间很长,那么您可以喝杯咖啡来消磨时间,讨论自动垃圾收集的所有缺点。


有时,通过执行CMake优化可以取得一定的成功。这里考虑的技术基于一个简单的想法:可以同时组装使用彼此功能的两个静态库。


有点解剖


首先,请考虑构建静态库的基本步骤:


  • 预处理器 -从源文件中删除所有注释,插入头文件,并将宏替换为计算出的值。
  • 编译器 -将预处理器处理的文件转换为汇编代码。
  • 汇编程序 -将汇编代码转换为机器代码;结果保存为目标文件。
  • 存档器 -将目标文件收集到单个存档中。

这些步骤以图形方式显示在图中:



, . , . . , , . 



, , CMake target_link_libraries. :


target_link_libraries(staticC PRIVATE staticB)

, — staticC staticB. , , , staticC, staticB.


, CoherentDeps, :



, staticC staticB, .



, , , ( , ) INTERFACE, -meta ( , ). , -, .


target_link_libraries .


, :



: NonCoherentDeps.


:


  • staticA
  • staticB
  • staticC

NonCoherentDeps.


staticB staticA, staticC staticB, NonCoherentDeps staticC. :



CMake- staticA - :


add_library(staticA-meta INTERFACE)
target_include_directories(staticA-meta  INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}")

, :


target_link_libraries(staticA PUBLIC staticA-meta)

staticB CMake


target_link_libraries(staticB PRIVATE staticA)

:


target_link_libraries(staticB PRIVATE staticA-meta)

staticA staticB, . staticB staticA .


:



— :


add_executable(NonCoherentDeps main.cpp)
target_link_libraries(NonCoherentDeps PRIVATE staticC staticB staticA )


, .
, staticA, target_include_directories. NonCoherentDeps, :


target_include_directories(staticB PRIVATE "${path_to_headers_in_staticA}")

:


target_link_libraries(staticB PRIVATE staticA-meta)

, staticB staticA, staticC :


target_include_directories(staticC PRIVATE "${path_to_headers_in_staticB}" "${path_to_headers_in_staticA}")

. :


target_link_libraries(staticB-meta INTERFACE staticA-meta)

staticC :


target_link_libraries(staticC INTERFACE staticB-meta)

staticB, , .


同样,在元软件包中,您可以以命令的形式添加依赖项以生成头文件,并且属性是正确的路径。

Source: https://habr.com/ru/post/undefined/


All Articles