未定义参考,以提高计时器:: auto_cpu_timer(Undefined reference

2019-09-30 05:38发布

我有一个使用的unit_test_framework和文件系统库从升压一个CMake的项目。 我试图使用boost::timer::auto_cpu_timer并不能让它在Ubuntu 12.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项目不会没有计时链接。 我还与室温和并行线程库(从分布并行线程)无济于事试了一下。

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()'

我希望我没有忘记提及任何东西。 在此先感谢您的任何建议。

Answer 1:

如果你正在运行与从静态库未定义的引用的问题,您可以尝试明确告诉链接到包括整个档案,即使它(出于某种原因)认为,这是没有必要的。 有关编译器选项-Wl,--whole-archive ,并给它应该不会影响静态库之前。 更多的背景可以发现这个问题 。



文章来源: Undefined reference to Boost timer::auto_cpu_timer