让我们想象一下,我们有两个静态库,它们是独立的项目:
################################################
# 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}
)
答案 0 :(得分:3)
只要一个库/可执行目标使用另一个库目标,就使用target_link_libraries
。不要考虑链接静态库的冗余性。
在CMake中,链接目标比简单的链接库要多得多。 CMake的很大一部分是在链接时传播库属性。只需使用它即可。
此外,如果您决定将STATIC库转换为SHARED,请使用target_link_libraries
在这种转换中不提供其他操作。