C++静态库中未解析的外部符号

Dan*_*nyX 6 c++ static-libraries

我有两个项目; 静态库和测试.

我确信我已正确配置Visual Studio以"测试"项目使用静态库.这是我做的:

  1. 配置库项目以构建为静态库.lib
  2. 在测试中添加了其他包含目录(C/C++ - >常规 - >其他包含目录)
  3. 在测试中添加了额外的库目录(链接器 - >常规 - >附加库目录)
  4. 添加了我的库作为依赖项(链接器 - >输入 - >附加依赖项)

我可以看到我的"测试"项目看到.lib文件,似乎"尝试"链接到它.我注意到,当我在我的测试项目中使用对象(在类中定义)时,everthing很好.问题是我尝试使用函数(而不是成员函数!).

例:

在我的标题(.h)文件中:

/*includes omitted*/

namespace kx
{
   void func();
   /*...and more API functions*/
}
Run Code Online (Sandbox Code Playgroud)

在我的源文件(.cpp)中

#include "../MyHeader.h"

namespace kx
{
    void func()
    {
        /*definition...*/
    }

    /*and more definitions...*/
}
Run Code Online (Sandbox Code Playgroud)

会导致链接器错误; unresolved external symbol "void __cdecl kx::func()"

我在某处读到这是由C和C++代码混合引起的,对此的解决方案是extern "C"在函数声明中使用.我试过了,它解决了我的问题,但我似乎不清楚,因为我使用c ++.

另外,如果我理解正确的机制,当我使用extern "C"我的命名空间时将被忽略,这正是我在这个设计中不想要的.

接下来,我认为这可能__cdecl会导致这个问题,所以我将函数声明更改为void __stdcall func(),但我有完全相同的链接器错误unresolved external symbol "void __cdecl kx::func()"

我是C++程序员,当我向高级问题询问我的问题时,他们告诉我上面描述的设计应该没有 extern C,除非我不把它与C代码混在一起.

我想知道我的设置/方法/设计是否有问题.最后,我可以接受extern C方法,但如果这是唯一的解决方案,我会非常惊讶.

我使用visual studio 2017.