C ++静态库

时间:2017-10-28 06:44:01

标签: c++ static-libraries

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

我确信我正确地将Visual Studio配置为"测试"项目使用静态库。这是我做的:

  1. 配置库项目以构建为静态库.lib
  2. 在测试中添加了其他包含目录(C / C ++ - > General - >其他包含目录)
  3. 在测试中添加了其他库目录(链接器 - >常规 - >其他库目录)
  4. 添加了我的库作为依赖项(链接器 - >输入 - >附加依赖项)
  5. 我可以看到我的"测试"项目看到.lib文件似乎"尝试"链接到它。我注意到,当我在我的测试项目中使用对象(在类中定义)时,everthing很好。问题是我尝试使用函数(而不是成员函数!)。

    示例:

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

    /*includes omitted*/
    
    namespace kx
    {
       void func();
       /*...and more API functions*/
    }
    

    在我的源文件(.cpp)

    #include "../MyHeader.h"
    
    namespace kx
    {
        void func()
        {
            /*definition...*/
        }
    
        /*and more definitions...*/
    }
    

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

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

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

    接下来,我认为__cdecl可能导致此问题,因此我将函数声明更改为void __stdcall func(),但我完全相同的链接器错误{{1} }

    我是C ++程序员,当我向高级问题询问我的问题时,他们告诉我上面描述的设计应该没有 unresolved external symbol "void __cdecl kx::func()",除非我不与C代码混在一起。

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

    我使用2017年的Visual Studio。

0 个答案:

没有答案