您说得对!让我重新整理,将同类型的库合并介绍,让结构更清晰。
CMake中的库类型完整分类
特点
- 所有代码都在头文件中
- 编译时直接内联
- 不需要链接库文件
项目中的使用
include_directories(external/cpp-httplib) include_directories(external/websocketpp) include_directories(external/json-develop/include)
|
include_directories(external/spdlog) include_directories(external/fmt) include_directories(external/catch2)
|
2. 预编译库(系统库 +
第三方库)
特点
- 已编译的二进制文件
- 需要链接到可执行文件
- 包含头文件和库文件
项目中的使用
find_package(Threads REQUIRED) find_package(OpenSSL 3.0.0 REQUIRED) find_package(Boost COMPONENTS system thread REQUIRED)
target_link_libraries(chat_server ${CMAKE_THREAD_LIBS_INIT} ${OPENSSL_LIBRARIES} ${Boost_LIBRARIES} uuid stdc++fs )
|
预编译库的完整分类
A. 系统库
target_link_libraries(chat_server pthread uuid stdc++fs rt dl )
|
B. 第三方库
find_package(OpenSSL REQUIRED) find_package(Boost REQUIRED) find_package(Qt5 REQUIRED)
target_link_libraries(chat_server ${OPENSSL_LIBRARIES} ${Boost_LIBRARIES} ${Qt5_LIBRARIES} )
|
C. 平台特定库
if(WIN32) target_link_libraries(chat_server ws2_32 iphlpapi crypt32 ) endif()
if(APPLE) target_link_libraries(chat_server "-framework Foundation" "-framework Security" ) endif()
|
3. 自建库(项目内部库)
特点
创建和使用
add_library(common_lib STATIC src/common/utils.cpp src/common/logger.cpp )
add_library(shared_lib SHARED src/shared/network.cpp src/shared/protocol.cpp )
target_link_libraries(chat_server common_lib shared_lib )
|
4. 特殊库类型
A.
导入库(外部预编译库)
第三方只提供了库文件和头文件
add_library(external_lib IMPORTED) set_target_properties(external_lib PROPERTIES IMPORTED_LOCATION /path/to/libexternal.so IMPORTED_INCLUDE_DIRS /path/to/include )
target_link_libraries(chat_server external_lib)
|
B.
接口库(头文件库包装)
add_library(header_wrapper INTERFACE) target_include_directories(header_wrapper INTERFACE external/some_header_only_lib )
target_link_libraries(chat_server header_wrapper)
|
C.
对象库(编译但不链接)
add_library(obj_lib OBJECT src1.cpp src2.cpp) target_link_libraries(chat_server $<TARGET_OBJECTS:obj_lib>)
|
5. 库的链接方式总结
include_directories(external/header_only_lib)
|
预编译库
find_package(SomeLib REQUIRED) target_link_libraries(target ${SOMELIB_LIBRARIES}) target_include_directories(target PRIVATE ${SOMELIB_INCLUDE_DIRS})
|
自建库
add_library(my_lib src/lib.cpp) target_link_libraries(target my_lib)
|
6.
项目中的完整库处理流程
include_directories(external/cpp-httplib) include_directories(external/websocketpp) include_directories(external/json-develop/include)
find_package(Threads REQUIRED) find_package(OpenSSL 3.0.0 REQUIRED) find_package(Boost COMPONENTS system thread REQUIRED)
add_executable(chat_server ${SERVER_SOURCES})
target_link_libraries(chat_server ${CMAKE_THREAD_LIBS_INIT} ${OPENSSL_LIBRARIES} ${Boost_LIBRARIES} uuid stdc++fs )
target_include_directories(chat_server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/server ${CMAKE_CURRENT_SOURCE_DIR}/src/common ${OPENSSL_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} )
|
7. 库类型选择指南
库类型 |
使用场景 |
优势 |
劣势 |
Header-Only库 |
小型工具库、模板库 |
简单、无依赖 |
编译时间长、二进制大 |
预编译库 |
大型库、系统库 |
性能好、编译快 |
依赖管理复杂 |
自建库 |
项目模块化 |
完全控制、易调试 |
增加构建复杂度 |
这样的分类让库的管理更加清晰,每种类型都有其特定的使用场景和优势。