【问题标题】:boost function and bind external symbol增强功能和绑定外部符号
【发布时间】:2012-10-04 08:59:08
【问题描述】:

我需要在我的程序中使用绑定和函数。但不幸的是vs2010无法链接我的程序。 我使用了 boost::bind 文档中的以下示例

#include <boost\bind.hpp>
#include <boost\function.hpp>
#include <functional>

class button
{
 public:

 boost::function<void()> onClick;
};


class player
{
 public:

  void play();
  void stop();
};

button playButton, stopButton;player thePlayer;

void connect()
{
playButton.onClick = boost::bind(&player::play, &thePlayer);
stopButton.onClick = boost::bind(&player::stop, &thePlayer);
}


void main(int argc, char* argv[])
{
connect();
}

错误 1 ​​错误 LNK2019:函数“void __cdecl connect(void)”(?connect@@YAXXZ) 中引用的未解析外部符号“public: void __thiscall player::stop(void)”(?stop@player@@QAEXXZ) )

我已经尝试了最新的 32 和 64 版本的 BoostPro 并按照本教程进行操作 http://www.youtube.com/watch?v=5AmwIwedTCM.All 但 vs 仍然产生相同的错误...

VS2010项目设置include/lib路径 https://dl.dropbox.com/u/47585151/vs.png

但是当我打开时

Linker->General->ShowProgress ->对于搜索的库 (/VERBOSE:Lib)

我注意到 VS 只搜索在

中定义的这些库

链接器->输入->附加依赖

http://pastebin.com/BCpEt8Zq

vs2010下是否可以检查boost::bind和boost::function需要哪个.lib boost?

【问题讨论】:

    标签: c++ visual-studio-2010 boost linker


    【解决方案1】:

    这个问题与任何 boost 库都无关(两者都是 header-only)。尝试从connect 中简单地调用 startstop,你应该会得到同样的错误。仔细阅读,它会告诉你缺少什么。

    【讨论】:

    • 我只是在函数 void play(){} 中添加了 body;它神奇地开始工作。你能解释为什么它很重要以及为什么它会产生链接错误吗?
    • @user:我认为您需要 a good book 来解释这一点。当你在任何地方只做void play(); 时,基本上会发生什么,是你告诉编译器一个名为“play”的函数存在于最终程序中的某处,但你还不知道在哪里。链接器的工作是找到这个函数(一个未解析的外部符号)并将所有对它的引用(如player::connect)解析为那个函数。您根本没有在任何地方实现(定义play,因此链接器无法解析引用。
    猜你喜欢
    • 2023-03-31
    • 2018-03-26
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 2011-10-25
    相关资源
    最近更新 更多