C++ 链接到共享库时,Boost日志无法正常工作

C++ 链接到共享库时,Boost日志无法正常工作,c++,cmake,shared-libraries,static-libraries,boost-log,C++,Cmake,Shared Libraries,Static Libraries,Boost Log,我尝试这样做:在Windows(*.dll)上创建一个使用Boost::Log的共享库 (我想静态地将Boost::Log链接到此库,因为我希望所有内容都只打包在一个DLL文件中),但是没有成功 我的项目有4个文件,如下所示: My CMakeLists.txt:(还有另一个CMakeLists.txt可以通过find\u包查找Boost库(Boost 1.54.0必需的线程日志\u设置文件系统日期\u时间系统)) My mylog.cpp: 但是如果我将它编译到一个DLL共享库(带有共享关键字

我尝试这样做:在Windows(*.dll)上创建一个使用Boost::Log的共享库 (我想静态地将Boost::Log链接到此库,因为我希望所有内容都只打包在一个DLL文件中),但是没有成功

我的项目有4个文件,如下所示:

My CMakeLists.txt:(还有另一个CMakeLists.txt可以通过
find\u包查找Boost库(Boost 1.54.0必需的线程日志\u设置文件系统日期\u时间系统)

My mylog.cpp:

但是如果我将它编译到一个DLL共享库(带有共享关键字),编译是成功的,但结果不是预期的未创建日志文件,消息以不同格式显示在屏幕上。看起来函数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::Little,但结果是一样的。Boost 1.54.0和1.55.0都经过测试。

看来您需要适当地配置和构建
Boost::log
,以支持动态链接。否则,它将采用静态链接模型

此处的文档:

相关报价:

该库有一个单独编译的部分,该部分应作为 在中描述。需要注意的是,, 不过。如果您的应用程序包含多个模块(例如 exe和一个或多个dll)使用Boost.Log时,库必须 构建为共享对象。如果您有一个可执行文件或一个 使用Boost.Log的模块,您可以将库构建为 静态库


调用端的
initLog()
prototype上需要一个
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")
现在,只有在构建mylog库时才使用dllexport,而包含该文件的任何其他内容都将获得dllimport


如果您还想支持静态模式,请在整个BUILD\u MYLOG\u DLL子句周围添加另一个条件,该子句将dllatAttribute定义为空。

谢谢您的回复。问题是,如果我添加definition-DBOOST\u LOG\u DYN\u链接,它将动态构建,这意味着程序testlog也需要boost\u LOG\u*.dll才能正常运行,同时我想找到一种方法,将boost::LOG集成到一个dll文件中。@kevin.bui:我不太了解Windows开发环境,但从原则上看,一旦有了两个DLL(一个带代码,一个带Boost),就可以将它们合并为一个。编辑:谷歌搜索表明这显然是一个很高的要求。我在谷歌上搜索了你的建议,但它们似乎只是将两个文件连接在一起,但这种方式可能会产生名称空间冲突。此外,我仍然不明白Boost是如何做出这样的反应的。嗯,谢谢你的建议。我确实试过你的方法,但还是不成功。在编译mylog.cpp和mylog.h时,编译器使用dllexport,而在编译main.cpp时,使用dllimport。但结果仍然是一样的。你能帮我试试你的电脑吗?谢谢
#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;
}
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         
[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          
#ifdef BUILD_MYLOG_DLL
#define DLLATTRIBUTE __declspec( dllexport )
#else
#define DLLATTRIBUTE __declspec( dllimport )
#endif

DLLATTRIBUTE void initLog();
SET_TARGET_PROPERTIES(mylog PROPERTIES COMPILE_DEFINITIONS "BUILD_MYLOG_DLL")