Boost日志在链接到共享库时无法正常工作
Boost Log does not work correctly when linked to a shared library
我尝试过这样做:在Windows(*.dll)上创建一个共享库,该库使用Boost::Log(我想静态地将Boost::Log链接到此库,因为我希望所有内容都只打包在一个dll文件中),但没有成功。
我的项目有4个文件如下:
MyCMakeLists.txt:(还有另一个CMakeList.txt,它可以找到带有find_package(Boost 1.54.0 REQUIRED thread log log_setup filesystem date_time system)
的Boost库)
cmake_minimum_required(VERSION 2.6)
add_library(mylog SHARED
mylog.cpp
)
target_link_libraries(mylog ${Boost_LIBRARIES})
if(UNIX)
target_link_libraries(mylog rt)
endif(UNIX)
add_executable(testlog
main.cpp
)
target_link_libraries(testlog mylog)
Mymylog.cpp:
#include "mylog.h"
namespace logging = boost::log;
namespace expr = boost::log::expressions;
namespace keywords = boost::log::keywords;
__declspec( dllexport ) void initLog()
{
logging::add_file_log(
keywords::file_name = "testlog.log",
keywords::format = expr::format("%1% [%2%] %3% ")
% expr::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d, %H:%M:%S.%f")
% expr::attr< logging::trivial::severity_level >("Severity")
% expr::smessage
);
logging::add_common_attributes();
}
和mylog.h:
#ifndef _MYLOG_H
#define _MYLOG_H
#include <boost/log/common.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/attributes.hpp>
#include <boost/log/sinks.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/console.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/support/date_time.hpp>
#include <boost/date_time/local_time/local_time.hpp>
#include <boost/log/utility/empty_deleter.hpp>
__declspec( dllexport ) void initLog();
#endif //_MYLOG_H
我的main.cpp:
#include "mylog.h"
int main(int, char*[])
{
using namespace boost::log::trivial;
initLog();
BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
BOOST_LOG_TRIVIAL(info) << "An informational severity message";
BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
BOOST_LOG_TRIVIAL(error) << "An error severity message";
BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";
return 0;
}
当我将库mylog编译为静态库(不带SHARED关键字)并运行程序testlog时,日志消息被保存在文件testlog.log中,并且没有任何东西打印到屏幕上,正如代码所说:
2013-12-20, 15:05:36.741156 [trace] A trace severity message
2013-12-20, 15:05:36.742156 [debug] A debug severity message
2013-12-20, 15:05:36.743156 [info] An informational severity message
2013-12-20, 15:05:36.743156 [warning] A warning severity message
2013-12-20, 15:05:36.743156 [error] An error severity message
2013-12-20, 15:05:36.743156 [fatal] A fatal severity message
但是,如果我将它编译到DLL共享库(使用shared关键字),编译是成功的,但结果并不像预期的那样没有创建日志文件,消息以不同的格式显示在屏幕上。看起来函数initLog没有运行:
[2013-12-20 15:06:17.195469] [0x00000e6c] [trace] A trace severity message
[2013-12-20 15:06:17.198470] [0x00000e6c] [debug] A debug severity message
[2013-12-20 15:06:17.198470] [0x00000e6c] [info] An informational severity message
[2013-12-20 15:06:17.199470] [0x00000e6c] [warning] A warning severity message
[2013-12-20 15:06:17.199470] [0x00000e6c] [error] An error severity message
[2013-12-20 15:06:17.200470] [0x00000e6c] [fatal] A fatal severity message
请帮我一下。谢谢
p/S:我也尝试过为日志创建自定义接收器,而不是使用Boost::Log::Trivial,但结果是一样的。Boost 1.54.0和1.55.0都经过了测试。
您似乎需要适当地配置和构建boost::log
以支持动态链接。否则,它将假定一个静态链接模型。
此处的文档:http://boost-log.sourceforge.net/libs/log/doc/html/log/installation/config.html
相关报价:
该库有一个单独编译的部分,应该构建为如《入门》指南中所述。需要注意的是,虽然如果您的应用程序包含多个模块(例如exe和一个或多个dll),则库必须是构建为共享对象。如果您有一个可执行文件或模块,您可以将库构建为静态库。
在调用端的initLog()
原型上需要一个dllimport
属性。一种惯用的方法是使用预处理器定义来告诉mylog.h它是从DLL构建中包括的(在这种情况下它需要dllexport
),还是从链接到DLL的可执行文件中包括的,在这种情况中它需要dllimport
:
mylog.h:
#ifdef BUILD_MYLOG_DLL
#define DLLATTRIBUTE __declspec( dllexport )
#else
#define DLLATTRIBUTE __declspec( dllimport )
#endif
DLLATTRIBUTE void initLog();
CMakeLists.txt:
SET_TARGET_PROPERTIES(mylog PROPERTIES COMPILE_DEFINITIONS "BUILD_MYLOG_DLL")
现在,dllexport只在构建mylog库时使用,而包括该文件的任何其他文件都将获得dllimport。
如果您也想支持静态模式,请在整个BUILD_MYLOG_DLL子句周围添加另一个条件,该子句将DLLIBUTE定义为空。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- C++程序已停止工作-求解常微分方程