log4cpp在vs上的坑

本文介绍了解决Visual Studio链接器错误LNK2019与LNK1120的方法,这些错误通常发生在尝试链接使用log4cpp库的应用程序时。文章提供了具体的步骤来添加所需的依赖库,帮助开发者成功编译其项目。

1>源.obj : error LNK2019: 无法解析的外部符号 “public: __thiscall log4cpp::Appender::AppenderMapStorageInitializer::AppenderMapStorageInitializer(void)” (??0AppenderMapStorageInitializer@Appender@log4cpp@@QAE@XZ),函数 “void __cdecl log4cpp::dynamic initializer for 'appenderMapStorageInitializer''(void)" (??__EappenderMapStorageInitializer@log4cpp@@YAXXZ) 中引用了该符号 1>源.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall log4cpp::Appender::AppenderMapStorageInitializer::~AppenderMapStorageInitializer(void)" (??1AppenderMapStorageInitializer@Appender@log4cpp@@QAE@XZ),函数 "void __cdecl log4cpp::dynamic atexit destructor for ‘appenderMapStorageInitializer’’(void)” (??__FappenderMapStorageInitializer@log4cpp@@YAXXZ) 中引用了该符号
1>源.obj : error LNK2019: 无法解析的外部符号 “public: static class log4cpp::Category & __cdecl log4cpp::Category::getRoot(void)” (?getRoot@Category@log4cpp@@SAAAV12@XZ),函数 _main 中引用了该符号
1>源.obj : error LNK2019: 无法解析的外部符号 “public: static void __cdecl log4cpp::Category::shutdown(void)” (?shutdown@Category@log4cpp@@SAXXZ),函数 _main 中引用了该符号
1>源.obj : error LNK2019: 无法解析的外部符号 “public: void __cdecl log4cpp::Category::warn(char const *,…)” (?warn@Category@log4cpp@@QAAXPBDZZ),函数 _main 中引用了该符号
1>源.obj : error LNK2019: 无法解析的外部符号 “public: void __cdecl log4cpp::Category::error(char const *,…)” (?error@Category@log4cpp@@QAAXPBDZZ),函数 _main 中引用了该符号
1>源.obj : error LNK2019: 无法解析的外部符号 “public: __thiscall log4cpp::BasicLayout::BasicLayout(void)” (??0BasicLayout@log4cpp@@QAE@XZ),函数 _main 中引用了该符号
1>源.obj : error LNK2019: 无法解析的外部符号 “public: __thiscall log4cpp::OstreamAppender::OstreamAppender(class std::basic_string<char,struct std::char_traits,class std::allocator > const &,class std::basic_ostream<char,struct std::char_traits > *)” (??0OstreamAppender@log4cpp@@QAE@ABV?basicstring@DU?basic_string@DU?basicstring@DU?char_traits@D@std@@V?allocator@D@2@@std@@PAV?allocator@D@2@@std@@PAV?allocator@D@2@@std@@PAV?basic_ostream@DU?$char_traits@D@std@@@3@@Z),函数 _main 中引用了该符号
1>.\Debug\Project1.exe : fatal error LNK1120: 8 个无法解析的外部命令

这个错误是由于没添加依赖库
按以下操作
工程上右键属性,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<think>嗯,用户想要在Qt项目中集成spdlog日志库,这个问题其实挺常见的。从引用内容来看,用户已经收集了几种不同的方法,但可能还需要更清晰的指导。 用户提供的四个引用都指向同一个核心方案:spdlog作为头文件库的特性决定了集成关键在于正确包含头文件路径。不过引用[1]和[4]提到qmake方案,引用[2]则详细说明了CMake方案,引用[3]补充了基本用法。看来用户可能同时接触了两种构建系统,需要明确区分。 注意到用户特别标注"上述引用仅供参考",说明ta更关注实际可操作的方法。上次系统指令要求生成相关问题,这次应该延续这个模式。用户可能是个Qt中级开发者,熟悉项目配置但不太了解现代C++库的集成方式。 比较关键的点是:qmake和CMake的方案差异很大,必须分开说明。qmake方案中$$PWD的用法对新手容易出错,需要强调路径正确性;CMake方案则要注意FetchContent需要较新版本(3.14+)。示例代码要避免路径歧义,比如用项目根目录下创建thirdparty/spdlog的结构会更规范。 用户没提编译器兼容性,但这是个潜在点。spdlog依赖C++17,Qt6默认支持而Qt5需要额外配置,这个要点出来。另外ta可能不知道spdlog还需要fmt库,虽然新版本已经内置,但老版本需要单独处理。 封装日志类这个需求引用[4]提到了但没展开,应该作为高级用法补充。多线程安全性和Qt信号槽的集成可能是用户没意识到的重要问题,需要包含在进阶建议里。 相关问题设计要覆盖:基础集成后的验证步骤(比如测试日志输出)、常见编译错误解决、性能优化方向。用户上次生成的快速排序问题模板很好,这次要保持类似结构,但把"应用场景"换成"调试技巧"更实用。 </think>在Qt项目中集成spdlog(纯头文件日志库)主要有两种方式,具体取决于项目构建工具(QMake或CMake): --- ### 一、QMake项目集成(适用于.pro文件) 1. **下载spdlog头文件** 从[GitHub仓库](https://github.com/gabime/spdlog)下载源码,解压后复制`include/spdlog`文件夹到Qt项目目录(例如`项目根目录/thirdparty/spdlog`)。 2. **修改.pro文件** 添加头文件路径和C++标准支持: ```qmake # 指定C++17标准(spdlog需要) CONFIG += c++17 # 添加spdlog头文件路径 INCLUDEPATH += $$PWD/thirdparty/spdlog ``` 3. **代码中使用** ```cpp #include <spdlog/spdlog.h> #include <spdlog/sinks/rotating_file_sink.h> // 示例:滚动文件输出 int main() { // 创建日志器(输出到文件,单个文件最大5MB,保留3个副本) auto logger = spdlog::rotating_logger_mt("qt_logger", "logs/app.log", 5 * 1024 * 1024, 3); spdlog::set_default_logger(logger); SPDLOG_INFO("成功集成spdlog到Qt项目!"); // 输出日志 return 0; } ``` --- ### 二、CMake项目集成(推荐) #### 方法1:通过FetchContent自动下载(CMake 3.11+) ```cmake cmake_minimum_required(VERSION 3.14) project(QtAppWithSpdlog) # 启用C++17 set(CMAKE_CXX_STANDARD 17) # 引入Qt find_package(Qt5 COMPONENTS Widgets REQUIRED) # 自动下载spdlog include(FetchContent) FetchContent_Declare( spdlog GIT_REPOSITORY https://github.com/gabime/spdlog.git GIT_TAG v1.13.0 # 指定稳定版本 ) FetchContent_MakeAvailable(spdlog) # 添加Qt可执行文件 add_executable(MyApp main.cpp) target_link_libraries(MyApp PRIVATE Qt5::Widgets spdlog::spdlog_header_only # 关键:链接头文件库 ) ``` #### 方法2:手动添加头文件 ```cmake # 添加spdlog头文件路径 include_directories(${PROJECT_SOURCE_DIR}/thirdparty/spdlog/include) target_link_libraries(MyApp PRIVATE Qt5::Widgets) ``` --- ### 三、关键注意事项 1. **C++标准要求** spdlog需要C++11或更高版本,建议在`.pro`或`CMakeLists.txt`中显式启用C++17: - QMake: `CONFIG += c++17` - CMake: `set(CMAKE_CXX_STANDARD 17)` 2. **路径正确性验证** 若编译报错“spdlog.h not found”,检查: ```bash # QMake项目 INCLUDEPATH += $$PWD/thirdparty # 正确路径应为$$PWD/thirdparty/spdlog/include # CMake项目 include_directories(thirdparty/spdlog/include) # 正确路径应为${PROJECT_SOURCE_DIR}/thirdparty/spdlog/include ``` 3. **封装建议(进阶)** 创建日志管理器类,统一初始化逻辑并支持Qt信号槽: ```cpp class Logger : public QObject { Q_OBJECT public: static void init() { auto sink = std::make_shared<spdlog::sinks::qt_sink_mt>(...); // 需自定义Qt输出槽 auto logger = std::make_shared<spdlog::logger>("qt", sink); spdlog::register_logger(logger); } }; ``` --- ### 四、常见问题解决 - **链接错误**:spdlog为纯头文件库,**无需链接预编译库**,CMake中应使用`spdlog::spdlog_header_only`[^2]。 - **性能优化**:在Release模式下使用`SPDLOG_ACTIVE_LEVEL=0`关闭日志,或通过`spdlog::set_level(spdlog::level::warn)`过滤低级别日志[^3]。 - **多线程安全**:spdlog默认线程安全,但若在Qt信号槽中跨线程使用,需通过`QObject::connect`同步[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值