【问题标题】:CmakeList: Dependencies for static librariesCmakeList:静态库的依赖项
【发布时间】:2018-07-17 15:15:10
【问题描述】:

假设我们有两个独立的静态库:

################################################
# Logger library ###############################

set(Logger_INCLUDE_DIRS Logger/include)
set(Logger_LIBRARIES Logger)

add_library(Logger STATIC
    ${PROJECT_HEADERS}
    ${PROJECT_RESOURCES}
    ${PROJECT_SOURCES}
    ${MISC}
    )
target_include_directories(Logger
    PUBLIC
        include
        )

################################################
# Utils library ################################

add_library(Utils STATIC
    ${PROJECT_HEADERS}
    ${PROJECT_RESOURCES}
    ${PROJECT_SOURCES}
    ${MISC}
    )

Utils 库依赖于 Logger 库进行日志记录

以下哪种方式适合提供 Logger 来源 Utils 图书馆,否则它们都不正确,我需要使用另一种

我这里有两个选择,第一个是只提供 *.h 文件,据了解,静态库就足够了:

target_include_directories(Utils
    PUBLIC
        include
        ${Logger_INCLUDE_DIRS}
        )

另一种是使用target_link_libraries,据我了解,*.h 文件也是链接的,但通常我们不需要将一个静态库与另一个链接,这是多余的:

target_link_libraries(Utils
    ${Logger_LIBRARIES}
    )

【问题讨论】:

  • 第二个更好,因为有一天你可以将Logger切换到共享库中,除了切换库类型之外不会有任何问题。您所说的冗余不会让您付出任何代价。

标签: c++ cmake dependencies static-libraries


【解决方案1】:

当一个库/可执行目标使用另一个库目标时,使用target_link_libraries。不要考虑链接静态库的冗余。

在 CMake 中,链接 targets 不仅仅是简单的链接库。 CMake 的很大一部分是在链接时传播库属性。就用那个吧。


此外,如果您决定将 STATIC 库转换为 SHARED,则使用 target_link_libraries 在此类转换中不提供任何其他操作。

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多