Boost.Signals2 を使用した実験で、次の非常に素朴なプログラムをコンパイルしようとしました。プログラムはコンパイルされましたが、リンカー エラーが発生しました (エラー メッセージについては、この質問の下部を参照してください)。
// hello.cpp
#include <boost/signals2.hpp>
int main(int argc, char *argv[])
{
boost::signals2::signal<void()> sig;
}
エラーが発生した理由とその修正方法
( 2014 年 9月 17 日の更新:この問題はまだ解決されていません。このプログラムは、Windows XP では GCC4.9 と Code::Blocks、Mac OS X Mavericks では Clang と Xcode 5 を使用して正常にビルドできますが、いくつかの不可解な理由によりMac OS X で GCC4.9 と Eclipse を使用してプログラムをビルドすると、リンク エラーが解消されません。)
SO で次の関連スレッドを見つけましたが、私の質問に答えるものはないようです。
- boost::signals2 ライブラリをリンクするときの undefined-reference
- ヘッダーのみのライブラリを使用する場合のブースト リンカー エラー
- boost.signals2 ライブラリをビルドする必要がありますか?
エラーメッセージは次のとおりです。
make all
Building file: ../src/hello.cpp
Invoking: GCC C++ Compiler
/usr/local/bin/g++-4.9 -I/usr/include -I/usr/local/include -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"src/hello.d" -MT"src/hello.d" -o "src/hello.o" "../src/hello.cpp"
Finished building: ../src/hello.cpp
Building target: hello
Invoking: MacOS X C++ Linker
/usr/local/bin/g++-4.9 -L/usr/local/lib -L/usr/lib -o "hello" ./src/hello.o
Undefined symbols for architecture x86_64:
"std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)", referenced from:
void std::list<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (), boost::function<void ()> >, boost::signals2::mutex> >, std::allocator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (), boost::function<void ()> >, boost::signals2::mutex> > > >::_M_insert<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (), boost::function<void ()> >, boost::signals2::mutex> > const&>(std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (), boost::function<void ()> >, boost::signals2::mutex> > >, boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (), boost::function<void ()> >, boost::signals2::mutex> > const&) in hello.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [hello] Error 1