C++使用extern声明全局对象时出现链接器未定义符号错误如何解决
问题根源
你定义的logger对象和头文件中声明的foo::logger不属于同一个命名空间,因此链接器无法找到对应符号。
using namespace foo的作用仅为将foo命名空间内的现有名字引入当前作用域,方便你省略命名空间前缀访问这些成员,但不会将你新定义的变量自动归入foo命名空间。你在logger.cpp中写的Logger logger;实际是定义在全局命名空间下的::logger,和头文件声明的foo::logger是完全独立的两个符号,自然会触发未定义报错。
这个现象和变量类型无关,哪怕换成内置类型,只要声明在命名空间内、定义在命名空间外,就会出现同样的报错,和你测试的结果完全一致。
修复方案
以下两种写法二选一即可:
方案1:定义时显式指定命名空间
修改logger.cpp中的变量定义行,显式标注命名空间:
#include "logger.hpp" using namespace foo; void Logger::log(int num) { /* Do stuff */ } // 显式指定logger属于foo命名空间 foo::Logger logger;
方案2:将定义包裹在命名空间块内
修改logger.cpp,把类成员函数实现和变量定义都放在foo命名空间块中,这种写法更不容易出错:
#include "logger.hpp" namespace foo { void Logger::log(int num) { /* Do stuff */ } Logger logger; } // namespace foo
内容的提问来源于stack exchange,提问作者Quickeman
相关产品推荐
相关产品推荐

