链接到带命名空间的静态库时未解析的外部符号

时间:2014-07-13 20:42:20

标签: c++ static-libraries

我今天遇到了一个我不完全理解的行为。我直接进入一个最小的代码示例,并将一路解释。

我有2个项目:静态c ++库和控制台应用程序。

静态Lib项目:

Library.h

#pragma once

namespace foo
{
    int testFunc();

    class StaticLibClass
    {
    public:
        static int testMemberFunc();
    };

}

Library.cpp

#include "Library.h"

using namespace foo;

// just some functions that don't do much
int testFunc()
{
    return 10;
}

int StaticLibClass::testMemberFunc()
{
    return 11;
}

控制台应用项目:

的main.cpp

#include "library.h"

using namespace foo;

void main()
{
    // calling this function reslts in LNK2019: unresolved external symbol...
    testFunc();

    // this function works just fine
    StaticLibClass::testMemberFunc();
}

正如您所看到的,类的静态成员函数运行正常。但是单个testFunc会导致链接器错误。这是为什么?

该问题的解决方案是不在Library.cpp文件中使用“using”,而是将其包装在命名空间中,如下所示:

解决问题的更改:

Library.cpp

#include "Library.h"

namespace foo
{

    // just some functions that don't do much
    int testFunc()
    {
        return 10;
    }

    int StaticLibClass::testMemberFunc()
    {
        return 11;
    }
}

1 个答案:

答案 0 :(得分:4)

您需要将实现函数/方法的主体包装在与原始标头匹配的名称空间语句中,或者您可以使用完全限定的名称,这可能是更好的C ++样式:

#include "Library.h"

// just some functions that don't do much
int foo::testFunc()
{
    return 10;
}

int foo::StaticLibClass::testMemberFunc()
{
    return 11;
}

你不需要使用名称空间foo;在这个版本中。你已经在命名空间中了#foo'在实现这两种方法的主体时,根据该命名空间中的其他类型可以很方便。