小编Dan*_*nyX的帖子

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

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

我确信我已正确配置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 …

c++ static-libraries

6
推荐指数
0
解决办法
1189
查看次数

在 DirectX 11 中渲染

当帧开始时,我会进行逻辑更新并在此之后进行渲染。在我的渲染代码中,我做通常的事情。我通过调用 Draw 设置了几个状态、缓冲、纹理和结束。

m_deviceContext->Draw(
        nbVertices,
        0);
Run Code Online (Sandbox Code Playgroud)

在帧结束时,我调用present 来显示渲染帧。

// Present the back buffer to the screen since rendering is complete.
if(m_vsync_enabled)
{
    // Lock to screen refresh rate.
    m_swapChain->Present(1, 0);
}
else
{
    // Present as fast as possible.
    m_swapChain->Present(0, 0);
}
Run Code Online (Sandbox Code Playgroud)

平时的东西。现在,当我调用 Draw 时,根据 MSDN

Draw 将工作提交给渲染管道。

这是否意味着数据被发送到 GPU 并且主线程(称为 Draw 的线程)继续?还是等待渲染完成?

在我看来,只有 Present 函数应该让主线程等待渲染完成。

directx-11

3
推荐指数
1
解决办法
2061
查看次数

功能中的智能指针

这是严格的理论问题.当项目基于智能指针时,几乎所有类都使用它们来包装它们的指针成员,将普通指针传递给成员/非成员函数是不好的做法?我的意思是,拥有成员函数是否正确:

void Function(SomeClass* pSomeClass);
Run Code Online (Sandbox Code Playgroud)

或者它应该始终是:

void Function(std::shared_ptr<SomeClass> pSomeClass);
Run Code Online (Sandbox Code Playgroud)

如果传递const引用有任何重要后果(标准const特性除外),我也会徘徊:

void Function(const std::shared_ptr<SomeClass>& pSomeClass)
Run Code Online (Sandbox Code Playgroud)

当类std::unique_ptr用于保护其成员时的情况如何,例如,在类私有成员函数中使用指向其成员的指针?它应该包裹吗?或者它应该被视为设计错误?

c++ smart-pointers std

3
推荐指数
2
解决办法
241
查看次数

异常处理时类型识别的工作原理

在c ++代码中的某处:

try 
{
   foo();
}
catch (const FooExceptionOne& e) 
{
    // ...
}
catch (const FooExceptionTwo& e) 
{
    // ...
}
catch (const std::exception& e) 
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

FooExceptionOne并且FooExceptionTwo是从中派生的自定义类std::exception.

在抛出异常的那一刻; 类型识别如何工作?它是某种动态铸造还是plymorphism,发生在"引擎盖下"?

我的第一个想法是动态铸造,但(当然)它似乎是非常缓慢的解决方案.

c++ exception-handling exception

3
推荐指数
1
解决办法
93
查看次数