使用命名空间的Static Lib导致无法解析的外部

时间:2014-07-02 22:54:41

标签: c++

我正在使用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 )
{
    ;
}

我显然不理解“使用命名空间”所发生的一切可以有人请赐教吗?谢谢!

1 个答案:

答案 0 :(得分:3)

当编译器看到非限定名称并需要找到它所引用的内容时,using namespace指令会更改符号的查找规则。

但是,在您的情况下,您正在定义名为foo new 函数。作为一个非限定名称,它在全局命名空间中定义了一个新的foo(假设那里没有一个)。当您对该名称进行限定时,您将根据需要定义StaticLibNamespace::foo

不同的解决方案可能是:

namespace StaticLibNamespace {

void foo( void )
{
    ;
}

} // namespace StaticLibNamespace