C++ 对Boost timer::auto\u cpu\u timer的未定义引用

C++ 对Boost timer::auto\u cpu\u timer的未定义引用,c++,boost,cmake,static-libraries,C++,Boost,Cmake,Static Libraries,我有一个CMake项目,它使用来自boost的单元测试框架和文件系统库。我试图使用boost::timer::auto\u cpu\u timer,但无法将其链接到Ubuntu 12.04上。基于Win32的构建工作正常 有问题的代码 #include <boost/timer/timer.hpp> long some_function() { boost::timer::auto_cpu_timer t; ...rest omitted... } 在可执行文件的

我有一个CMake项目,它使用来自boost的单元测试框架和文件系统库。我试图使用
boost::timer::auto\u cpu\u timer
,但无法将其链接到Ubuntu 12.04上。基于Win32的构建工作正常

有问题的代码

#include <boost/timer/timer.hpp>

long some_function()
{
    boost::timer::auto_cpu_timer t;
    ...rest omitted...
}
在可执行文件的子项目中,我使用以下说明。没有chrono,Win32项目无法链接。我还尝试了rt和pthread库(发行版中的pthread),但没有成功

目标链接库(
${Boost_系统_库}${Boost_文件系统_库}${Boost_单元_测试_框架_库}${Boost_计时_库}${Boost_定时器_库}
)
结果命令给出了错误。我添加了
-Q-v-Wl,-t
部分来查看链接器正在尝试做什么。(boost也是使用
-std=c++0x
标志编译的,否则文件系统将无法工作)

/usr/bin/c++-Q-v-Wl,-t-Wextra-fPIC-std=c++0x-Wextra-fPIC-std=c++0x-D\u调试\
-o../bin/-r动态\
/libs/boost_1_52_0/stage_x86/lib/libboost_system-gcc46-mt-sd-1_52.a\
/libs/boost_1_52_0/stage_x86/lib/libboost_filesystem-gcc46-mt-sd-1_52.a\
/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a\
/libs/boost_1_52_0/stage_x86/lib/libboost_timer-gcc46-mt-sd-1_52.a\
/libs/boost_1_52_0/stage_x86/lib/libboost_chrono-gcc46-mt-sd-1_52.a\
来自链接器的日志

/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
/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/i686linux-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)
(/libs/boost_1_52_0/stage_x86/lib/libboost_system-gcc46-mt-sd-1_52.a)错误代码o
(/libs/boost_1_52_0/stage_x86/lib/libboost_filesystem-gcc46-mt-sd-1_52.a)operations.o
(/libs/boost_1_52_0/stage_x86/lib/libboost_filesystem-gcc46-mt-sd-1_52.a)path.o
(/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)framework.o
(/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)进度监控
(/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)结果_collector.o
(/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)结果报告者
(/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)测试工具
(/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)unit_test_log.o
(/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)unit_test_main.o
(/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)unit_test_monitor.o
(/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)unit_test_parameters.o
(/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)unit_test_suite.o
(/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)xml_log_formatter.o
(/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)xml_report_formatter.o
(/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)编译器_log_formatter.o
(/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)debug.o
(/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)执行_monitor.o
(/libs/boost_1_52_0/stage_x86/lib/libboost_unit_test_framework-gcc46-mt-sd-1_52.a)普通报告格式化程序
-lstdc++(/usr/lib/gcc/i686linux-gnu/4.6/libstdc++.so)
-lm(/usr/lib/gcc/i686 linux-gnu/4.6/../../../../../i386 linux-gnu/libm.so)
-lgcc_s(/usr/lib/gcc/i686LinuxGNU/4.6/libgcc_.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/i386linux-gnu/ld-linux.so.2
-lgcc_s(/usr/lib/gcc/i686LinuxGNU/4.6/libgcc_.so)
/usr/lib/gcc/i686linux-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()'
.cpp:(.text+0x38):对“boost::timer::auto\u cpu\u timer::auto\u cpu\u timer(short)”的未定义引用
.cpp:(.text+0x4e8):对“boost::timer::auto\u cpu\u timer::~auto\u cpu\u timer()”的未定义引用
.cpp:(.text+0x543):对“boost::timer::auto\u cpu\u timer::~auto\u cpu\u timer()”的未定义引用

我希望我没有忘记提及任何事情。提前感谢您的建议。

如果您遇到来自静态库的未定义引用的问题,您可以尝试明确告诉链接器包含整个存档,即使它(出于某种原因)认为不需要。相关的编译器选项是
-Wl,--whole archive
,必须放在它应该影响的静态库之前。更多的背景信息可以在中找到。

尝试使用
-Wl,--whole archive
获取静态libs,如下所述:@us2012在-Wl,--whole archive和-Wl中包装boost timer,--no-whole archive,并将-lrt添加到最终效果。你是个圣人!可能重复的
<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()'