我正在尝试编写一个 C++ 日志库。它主要将
boost::log
用于 BOOST_LOG_SEV
宏。我可以使用我的库,而不会出现 LOG(debug) << "Test message"
之类的问题。这是我的公共标题。
include/logger.hpp
#include "config.hpp"
#define BOOST_LOG_DYN_LINK 1
#include <boost/log/sinks.hpp>
#include <boost/log/sources/global_logger_storage.hpp>
#include <boost/log/sources/severity_channel_logger.hpp>
#include <boost/log/trivial.hpp>
BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(logger, boost::log::sources::severity_channel_logger<severity_level>)
BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", severity_level)
#define LOG(severity) BOOST_LOG_SEV(logger::get(), severity)
class LoggerImpl; // forward declaration
namespace Logger {
void init(const Config &config);
inline std::unique_ptr<LoggerImpl> mImpl; // private implementation
}
由于我使用
BOOST_LOG_SEV
宏并执行一些 boost 配置,因此我需要在公共标头中包含 boost 标头。但是,这导致我需要将 boost 依赖项与我的输出共享库公开链接 (liblogger.so
)。因此,库使用 liblogger 作为依赖项,并且还需要与 boost::log
链接。如何在不影响我的库的使用的情况下隐藏公共头文件中的 boost 依赖项?
我尝试将
BOOST_LOG_SEV
宏用法和所有 boost 包含到私有实现中,但它不起作用,因为我无法捕获提供给 LOG(severity) <<
宏的字符流。
编辑:
CMakeLists.txt
set(PROJECT_NAME "Logger")
set(LIBRARY_NAME ${PROJECT_NAME})
string(TOLOWER ${PROJECT_NAME} LOWERCASE_PROJECT_NAME)
project(${PROJECT_NAME}
VERSION ${VERSION}
DESCRIPTION "Logging library"
)
add_subdirectory(include)
add_subdirectory(src)
set(Boost_USE_STATIC_LIBS OFF)
find_package(Boost 1.54 COMPONENTS log log_setup REQUIRED)
set(LIBRARIES
${Boost_LIBRARIES}
pthread
stdc++fs
)
add_library(${LIBRARY_NAME}
SHARED
${CXX_SOURCES}
${CXX_HEADERS}
)
set(INCLUDE_DIRS
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
"$<INSTALL_INTERFACE:include>")
target_include_directories(${LIBRARY_NAME} PUBLIC ${INCLUDE_DIRS})
target_link_libraries(${LIBRARY_NAME}
PUBLIC
${LIBRARIES}
)
set_target_properties(${PROJECT_NAME}
PROPERTIES
SKIP_BUILD_RPATH 1
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}
OUTPUT_NAME ${LOWERCASE_PROJECT_NAME}
)
install(TARGETS ${PROJECT_NAME}
EXPORT "${PROJECT_NAME}Targets"
LIBRARY
DESTINATION ${CMAKE_INSTALL_LIBDIR}
COMPONENT libraries
)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
COMPONENT headers
)
install(EXPORT ${PROJECT_NAME}Targets
NAMESPACE ${PROJECT_NAME}::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
COMPONENT headers
)
阅读评论后,我设法通过添加
include(CMakeFindDependencyMacro)
和 find_dependency
调用 configure_package_config_file
使用的配置文件来解决问题。
@PACKAGE_INIT@
include(CMakeFindDependencyMacro)
find_dependency(Boost 1.54 COMPONENTS log log_setup REQUIRED)
include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
check_required_components(@PROJECT_NAME@)
现在,使用
liblogger
作为依赖项的库不再需要显式调用 find_package(Boost ... )
。