2017-06-12 16 views
0

boost :: shared_mutexを使用しようとすると、奇妙なコンパイラ/リンカエラーが発生します。 32ビットrhel 6.2を実行しているVMでboost v1.61を使用しています。エラーが発生し-lboost_threadを指定しても "未定義の参照"エラーが発生する

コード:

HPPファイル:

#include <boost/thread/shared_mutex.hpp> 

class SharedData 
{ 
public: 
    SharedData(); 
    ~SharedData(); 

    void packMessage(std::shared_ptr<Message> s); 

private: 
    // mutex that allows multiple read, single write protection 
    boost::shared_mutex m_sharedMutex; 
}; 

のcppファイル:

void SharedData::packMessage(std::shared_ptr<Message> s) 
{ 
    // get shared read access 
    boost::shared_lock<boost::shared_mutex> lock(m_sharedMutex); // <- this line causes the errors 

    // read stuff here 
} 

make出力:

CMakeFiles/tester.dir/__/src/SharedData/SharedData.cpp.o: In function `boost::detail::interruption_checker::interruption_checker(pthread_mutex_t*, pthread_cond_t*)': 
/usr/local/include/boost/thread/pthread/thread_data.hpp:195: undefined reference to `boost::detail::get_current_thread_data()' 
CMakeFiles/tester.dir/__/src/SharedData/SharedData.cpp.o: In function `boost::condition_variable::wait(boost::unique_lock<boost::mutex>&)': 
/usr/local/include/boost/thread/pthread/condition_variable.hpp:81: undefined reference to `boost::this_thread::interruption_point()' 
CMakeFiles/tester.dir/__/src/SharedData/SharedData.cpp.o: In function `boost::shared_mutex::lock_shared()': 
/usr/local/include/boost/thread/pthread/shared_mutex.hpp:186: undefined reference to `boost::this_thread::disable_interruption::disable_interruption()' 
/usr/local/include/boost/thread/pthread/shared_mutex.hpp:193: undefined reference to `boost::this_thread::disable_interruption::~disable_interruption()' 
/usr/local/include/boost/thread/pthread/shared_mutex.hpp:193: undefined reference to `boost::this_thread::disable_interruption::~disable_interruption()' 
collect2: error: ld returned 1 exit status 
make[2]: *** [bin/tester] Error 1 

私が検索したどこでも述べていますその

target_link_libraries(${BINARY_NAME} boost_thread boost_system) 

しかし、エラーが続く:これらのエラーは、平均T私はcmakeのファイル(boost_systemはこれと同じプロジェクト内の他のコードのために含まれている)でやったboost_threadライブラリを、リンクする必要があります。

私のマシンに既にインストールされているブースト1.41ライブラリを使用していました。これらのエラーが発生したら、yum remove boost-develを実行し、ブースト1.61を手動でインストールしてエラーを修正するかどうかを確認します。 ./bootstrap.shまたは./b2 installコマンドに追加する必要があるものはありますか?私はlibboost_thread.a/usr/local/libに見ることができるので、スレッドライブラリが正しく構築されたことを前提としていました。

これらのエラーの原因は何ですか?ありがとう!

編集: cmakeののログは、私が見ることができる便利なものを持っていなかったが、make VERBOSE=1は、次のような出力が得られます。

cd /home/craig/dev/myProject/build/test && /usr/bin/cmake -E cmake_link_script CMakeFiles/tester.dir/link.txt --verbose=1 
/opt/rh/devtoolset-2/root/usr/bin/c++ -std=c++11 -ggdb -Wall -Werror -fprofile-arcs -ftest-coverage -fPIC -O0 -pedantic -Wl,--export-dynamic CMakeFiles/tester.dir/utilities/googletest/googletest/src/gtest-all.cc.o CMakeFiles/tester.dir/tester.cpp.o CMakeFiles/tester.dir/SharedData/testSharedData.cpp.o CMakeFiles/tester.dir/Common/testFifo.cpp.o CMakeFiles/tester.dir/Common/testCsu.cpp.o CMakeFiles/tester.dir/Messages/testMessage.cpp.o CMakeFiles/tester.dir/__/src/SharedData/SharedData.cpp.o CMakeFiles/tester.dir/__/src/Common/Fifo.cpp.o CMakeFiles/tester.dir/__/src/Common/Csu.cpp.o -o ../bin/tester -rdynamic -lboost_system -lpthread 
CMakeFiles/tester.dir/__/src/SharedData/SharedData.cpp.o: In function `boost::detail::interruption_checker::interruption_checker(pthread_mutex_t*, pthread_cond_t*)': 
/usr/local/include/boost/thread/pthread/thread_data.hpp:195: undefined reference to `boost::detail::get_current_thread_data()' 
CMakeFiles/tester.dir/__/src/SharedData/SharedData.cpp.o: In function `boost::condition_variable::wait(boost::unique_lock<boost::mutex>&)': 
/usr/local/include/boost/thread/pthread/condition_variable.hpp:81: undefined reference to `boost::this_thread::interruption_point()' 
CMakeFiles/tester.dir/__/src/SharedData/SharedData.cpp.o: In function `boost::shared_mutex::lock_shared()': 
/usr/local/include/boost/thread/pthread/shared_mutex.hpp:186: undefined reference to `boost::this_thread::disable_interruption::disable_interruption()' 
/usr/local/include/boost/thread/pthread/shared_mutex.hpp:193: undefined reference to `boost::this_thread::disable_interruption::~disable_interruption()' 
/usr/local/include/boost/thread/pthread/shared_mutex.hpp:193: undefined reference to `boost::this_thread::disable_interruption::~disable_interruption()' 
+1

Cmakeが表示するものだけでなく、コンパイルおよびリンクコマンドの呼び出しを表示してください。私はあなたがcmakeログファイルで見つけることができると思います。 – jww

答えて

0

は私の質問は、ちょうど皆のようなものですが判明。

@jww私は私の質問に追加したCMakeの出力ではなく、実際のコンパイルとリンクコマンドの呼び出しを示します。ご覧のとおり、コマンドはboost_systempthreadですが、boost_threadはリンクしていません。

私のプロジェクトを掘り起こすと、リリースビルドにboost_threadを追加したことに気付きましたが、私がコンパイルしようとしていたユニットテストビルドには追加されませんでした。ユニットテストのCMakeLists.txtにboost_threadを追加すると、すぐにエラーが取り除かれました。

関連する問題