Boostのunit_test_frameworkライブラリとファイルシステムライブラリを使用するCMakeプロジェクトがあります。使用しようとしていますboost::timer::auto_cpu_timer
が、Ubuntu12.04でリンクできません。Win32でのビルドは正常に機能します。
問題のコード。
#include <boost/timer/timer.hpp>
long some_function()
{
boost::timer::auto_cpu_timer t;
...rest omitted...
}
手作業でビルドされたブースト1.52.0を使用します(完全、バージョン管理、d、mt、mt-d、mt-s、mt-sd、s、sd、静的および共有)。
メインのCMakeLists.txtで次の構成を使用しています(ブーストを検出し、正しく機能します)
set (Boost_USE_STATIC_LIBS ON)
set (Boost_USE_MULTITHREADED ON)
if (MSVC)
set (Boost_USE_STATIC_RUNTIME OFF)
else ()
set (Boost_USE_STATIC_RUNTIME ON)
endif ()
find_package (
Boost ${BOOST_VERSION_MAJOR}.${BOOST_VERSION_MINOR}.${BOOST_VERSION_MICRO} COMPONENTS
system filesystem unit_test_framework chrono timer REQUIRED
)
if (Boost_FOUND)
include_directories (${Boost_INCLUDE_DIRS})
endif ()
実行可能ファイルのサブプロジェクトでは、次の手順を使用しています。Win32プロジェクトは、クロノなしではリンクしません。また、rtおよびpthreadライブラリ(ディストリビューションのpthread)を使用して試してみましたが、役に立ちませんでした。
target_link_libraries (
<exename> ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ${Boost_CHRONO_LIBRARY} ${Boost_TIMER_LIBRARY}
<other company libs>
)
エラーが発生するのは、結果のコマンドです。-Q -v -Wl,-t
リンカーが何をしようとしているのかを確認するためにパーツを追加しました。(ブーストも-std=c++0x
フラグを使用してコンパイルされました。そうしないと、ファイルシステムが機能しません)
/usr/bin/c++ -Q -v -Wl,-t -Wextra -fPIC -std=c++0x -Wextra -fPIC -std=c++0x -D_DEBUG \
<our object files> -o ../bin/<exe name> -rdynamic \
<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_system-gcc46-mt-sd-1_52.a \
<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_filesystem-gcc46-mt-sd-1_52.a \
<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a \
<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_timer-gcc46-mt-sd-1_52.a \
<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_chrono-gcc46-mt-sd-1_52.a \
<our other static libs>
リンカからのログ。
/usr/bin/ld: mode elf_i386
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crti.o
/usr/lib/gcc/i686-linux-gnu/4.6/crtbegin.o
/lib/i386-linux-gnu/libpthread.so.0
-lrt (/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/librt.so)
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_system-gcc46-mt-sd-1_52.a)error_code.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_filesystem-gcc46-mt-sd-1_52.a)operations.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_filesystem-gcc46-mt-sd-1_52.a)path.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)framework.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)progress_monitor.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)results_collector.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)results_reporter.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)test_tools.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)unit_test_log.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)unit_test_main.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)unit_test_monitor.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)unit_test_parameters.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)unit_test_suite.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)xml_log_formatter.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)xml_report_formatter.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)compiler_log_formatter.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)debug.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)execution_monitor.o
(<some dir>/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)plain_report_formatter.o
<our object files>
-lstdc++ (/usr/lib/gcc/i686-linux-gnu/4.6/libstdc++.so)
-lm (/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libm.so)
-lgcc_s (/usr/lib/gcc/i686-linux-gnu/4.6/libgcc_s.so)
/lib/i386-linux-gnu/libc.so.6
(/usr/lib/i386-linux-gnu/libc_nonshared.a)elf-init.oS
(/usr/lib/i386-linux-gnu/libc_nonshared.a)stat64.oS
(/usr/lib/i386-linux-gnu/libc_nonshared.a)lstat64.oS
(/usr/lib/i386-linux-gnu/libc_nonshared.a)stack_chk_fail_local.oS
/lib/i386-linux-gnu/ld-linux.so.2
-lgcc_s (/usr/lib/gcc/i686-linux-gnu/4.6/libgcc_s.so)
/usr/lib/gcc/i686-linux-gnu/4.6/crtend.o
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crtn.o
タイマーライブラリから何も使用していないようです。これは私が理解していない部分です。誰かが同様の問題を経験しましたか?依存関係がありませんか?結果として生じるエラーは単純です:
<some file>.cpp:(.text+0x38): undefined reference to `boost::timer::auto_cpu_timer::auto_cpu_timer(short)'
<some file>.cpp:(.text+0x4e8): undefined reference to `boost::timer::auto_cpu_timer::~auto_cpu_timer()'
<some file>.cpp:(.text+0x543): undefined reference to `boost::timer::auto_cpu_timer::~auto_cpu_timer()'
私は何も言及することを忘れなかったと思います。アドバイスをよろしくお願いします。