如何从输出共享库中隐藏宏的使用

问题描述 投票:0回答:1

我正在尝试编写一个 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
)
c++ cmake boost include header-files
1个回答
0
投票

阅读评论后,我设法通过添加

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 ... )

© www.soinside.com 2019 - 2024. All rights reserved.