我正在使用VS2013,我有一个带有以下标题的静态lib项目:
#pragma once
namespace StaticLibNamespace
{
void foo( void );
}
然后在cpp中定义函数如下:
#include "stdafx.h"
#include "StaticLibHeader.h"
using namespace StaticLibNamespace;
void foo( void )
{
;
}
在我的简单控制台应用程序中,我包含对StaticLibNameSpaceTest.lib的引用,我的主要功能如下:
#include "stdafx.h"
#include "..\StaticLibNamespaceTest\StaticLibHeader.h"
int _tmain(int argc, _TCHAR* argv[])
{
StaticLibNamespace::foo();
return 0;
}
如果我尝试编译它,我会收到以下错误: NamespaceTest.obj:错误LNK2019:函数_wmain中引用的未解析的外部符号“void __cdecl StaticLibNamespace :: foo(void)”(?foo @ StaticLibNamespace @@ YAXXZ)
但是,如果我将静态lib cpp文件更改为以下内容,则一切正常:
#include "stdafx.h"
#include "StaticLibHeader.h"
void StaticLibNamespace::foo( void )
{
;
}
我显然不理解“使用命名空间”所发生的一切可以有人请赐教吗?谢谢!
答案 0 :(得分:3)
当编译器看到非限定名称并需要找到它所引用的内容时,using namespace
指令会更改符号的查找规则。
但是,在您的情况下,您正在定义名为foo
的 new 函数。作为一个非限定名称,它在全局命名空间中定义了一个新的foo
(假设那里没有一个)。当您对该名称进行限定时,您将根据需要定义StaticLibNamespace::foo
。
不同的解决方案可能是:
namespace StaticLibNamespace {
void foo( void )
{
;
}
} // namespace StaticLibNamespace