【问题标题】:c++ Netbeans 7.2.1 linking boost libraries correctlyc ++ Netbeans 7.2.1正确链接boost库
【发布时间】:2013-01-23 22:08:33
【问题描述】:

我最近从 Visual Studio 2010 Express 切换到使用 NetBeans,我已经对布局和简单性印象深刻,尽管它确实需要一些推动才能正确编译。但是,我还有另一个问题。当我测试 boost 是否也能正常工作时,我将文件 boost/signals.hpp 包含在 main.cpp 中,然后转到项目选项中的其他库目录并添加我的 boost 安装的 lib 目录,与我会在视觉工作室做。毕竟,我还是得到了一堆未定义的引用。

我正在使用带有 msys 的 mingw 编译器,如果这有什么不同的话,我有 boost 版本 1.47。我可以确认,在使用 Visual Studio 时,同样的 boost 安装工作正常。

这是构建日志。

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory m`/c/Users/me/Documents/NetBeansProjects/Syncopate5/Syncopate5'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/MinGW-Windows/syncopate5.exe
make[2]: Entering directory `/c/Users/me/Documents/NetBeansProjects/Syncopate5/Syncopate5'
mkdir -p dist/Debug/MinGW-Windows
g++.exe     -o dist/Debug/MinGW-Windows/syncopate5 build/Debug/MinGW-Windows/main.o -L/C/Program\ Files\ \(x86\)/boost/boost_1_47/lib 
build/Debug/MinGW-Windows/main.o: In function `ZN5boost7signal0IvNS_10last_valueIvEEiSt4lessIiENS_8functionIFvvEEEED2Ev':
C:\Users\me\Documents\NetBeansProjects\Syncopate5\Syncopate5/../../../../../../Program Files (x86)/boost/boost_1_47/boost/signals/signal_template.hpp:139: undefined reference to `boost::signals::trackable::~trackable()'
C:\Users\me\Documents\NetBeansProjects\Syncopate5\Syncopate5/../../../../../../Program Files (x86)/boost/boost_1_47/boost/signals/signal_template.hpp:139: undefined reference to `boost::signals::detail::signal_base::~signal_base()'
make[2]: Leaving directory `/c/Users/me/Documents/NetBeansProjects/Syncopate5/Syncopate5'
C:\Users\me\Documents\NetBeansProjects\Syncopate5\Syncopate5/../../../../../../Program Files (x86)/boost/boost_1_47/boost/signals/signal_template.hpp:139: undefined reference to `boost::signals::detail::signal_base::~signal_base()'
make[1]: Leaving directory `/c/Users/me/Documents/NetBeansProjects/Syncopate5/Syncopate5'
build/Debug/MinGW-Windows/main.o: In function `ZN5boost7signal0IvNS_10last_valueIvEEiSt4lessIiENS_8functionIFvvEEEEC2ERKS2_RKS4_':
C:\Users\me\Documents\NetBeansProjects\Syncopate5\Syncopate5/../../../../../../Program Files (x86)/boost/boost_1_47/boost/signals/signal_template.hpp:197: undefined reference to `boost::signals::detail::signal_base::signal_base(boost::function2<bool, boost::signals::detail::stored_group, boost::signals::detail::stored_group> const&, boost::any const&)'
C:\Users\me\Documents\NetBeansProjects\Syncopate5\Syncopate5/../../../../../../Program Files (x86)/boost/boost_1_47/boost/signals/signal_template.hpp:197: undefined reference to `boost::signals::detail::signal_base::~signal_base()'
collect2.exe: error: ld returned 1 exit status
make[2]: *** [dist/Debug/MinGW-Windows/syncopate5.exe] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

编辑:

尝试通过项目属性中的添加库对话框手动添加所需的 lib 文件后,我收到此错误。

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory `/c/Users/me/Documents/NetBeansProjects/Syncopate5/Syncopate5'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/MinGW-Windows/syncopate5.exe
make[2]: Entering directory `/c/Users/me/Documents/NetBeansProjects/Syncopate5/Syncopate5'
make[2]: *** No rule to make target `../../../../../../Program Files \(x86\)/boost/boost_1_47/lib/libboost_signals-vc100-mt-1_47.lib', needed by `dist/Debug/MinGW-Windows/syncopate5.exe'.  Stop.
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
make[2]: Leaving directory `/c/Users/me/Documents/NetBeansProjects/Syncopate5/Syncopate5'
make[1]: Leaving directory `/c/Users/me/Documents/NetBeansProjects/Syncopate5/Syncopate5'

BUILD FAILED (exit value 2, total time: 9s)

【问题讨论】:

  • 您已经告诉 NetBeans 在哪里找到 Boost 库,但实际上并没有与任何链接。
  • 那么我将如何指示它这样做呢?为什么我从来不用在 Visual Studio 里做呢?
  • 在项目属性的某个地方应该有一个可以添加库的字段,您应该添加的是boost_signals。您设法添加了库搜索文件夹(在提供的日志中的链接器命令行中看到的 -L 参数),库可能也应该在该页面上。至于 Visual Studio,如果你想链接非标准库(如 Boost 库),你也需要手动添加它们。
  • 尝试手动添加该库,并且我已将错误日志添加到我的问题中。在visual studio中,我曾经链接到单个库,但后来发现在设置库的目录后,它会自动加载相关的。

标签: c++ static-libraries netbeans-7.2 boost-signals


【解决方案1】:

这取决于您如何构建项目。

如果您从现有的 makefile 构建项目,则您的库路径和库应该存在于构建环境中。

如果您通过将源、包含和库逐个合并来手动构建项目,则需要显式添加所需的库。

具体来说,查看您更新的构建日志,您似乎没有链接所需的库,而是以某种方式将其添加为目标。

右键单击您的项目,转到Properties,在Build 选项卡下查看Linker,您应该在此处指定链接路径和动态/静态库。

【讨论】:

  • 我承认我真的不太了解编译过程本身。我不知道 makefile 的重要性或目的是什么。当我制作项目时,我选择了为我制作了 makefile 的 C/C++ 应用程序项目。然后我刚刚在包含 boost/signals.hpp 的源文件夹中创建了一个 main.cpp 并尝试通过项目设置链接,通过 properties->build->linker 并将其他库目录设置为 boost_1_47/lib 然后选择库旁边的按钮并找到该库。我做了什么/没有做对什么?
  • 我不确定。看起来你已经完成了我为设置项目所做的一切。你是加了Library...还是Library File...
  • 我都试过了,我也试过文件的两个不同版本, .lib 和 .dll 。我之前在安装 mingw 时遇到了一些问题。当我从他们的网站运行下载并告诉它还包括 msys 时,msys 文件夹没有 make.exe,所以我卸载了整个东西,然后分别安装了 mingw 和 msys,在 c 中指定 make.exe: \msys\1.0\bin\make.exe 作为我对 netbeans 的 make 命令。这让我可以很好地构建一个 hello world。这种变化可能与我的问题有关吗?就像我说的,我对 makefile 了解不多:\.
  • 还有一个有趣的花絮,我能够在他们的选择库对话框中选择 .lib 文件的唯一方法是告诉它查找文件类型:所有文件。唯一可用的选项是 .a 和 .dll 。即使选择了 .dll,lib 文件夹中的 .dll 文件也不会出现。这整个问题可能是因为 netbeans 7.2.1 无法识别 .lib 还是可能只是错误?现在重新安装它。
【解决方案2】:

经过数小时的谷歌搜索和阅读,我发现了更多关于 boost 的信息,终于找到并理解了我的问题。当我最初获得我的 boost 安装时,它来自 BoostPro,它具有所有仅标头对象,以及仅用于 vc++ 的预编译二进制文件。在获得最新版本的 boost 和 boost.build 以创建库的 gcc 版本并链接它们之后,它可以顺利运行。感谢 Tyler Jandreau 和 Joachim Pileborg 回答了我天生有缺陷的问题:.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2017-10-18
    相关资源
    最近更新 更多