Boost logo

Boost Users :

Subject: Re: [Boost-users] NEWBIE: Undefined references: How do I find the library that resolves an undefined reference - Expanded with log example and hope for a general solution
From: JENNINGS, LYNN M NH-03 USAF AFMC 517 SMXS/MXDPB (lynn.jennings_at_[hidden])
Date: 2017-01-26 13:47:41


Thanks again Andy!

I am sending this note to thank Andy for his gracious help and to document the resolution for future newbies.

Andy's suggestion to "nm -Cg" the boost.log directories was just what I needed! (Sorry, I should have remembered the -C option when I got nothing but garbage.)

What I found was that the header files I use, generate a reference to ...::v2s_mt_nt5::..., while the libraries only define the namespace with ...::v2_mt_nt5::...

For example, my code has the following:

#include <boost\log\core.hpp>
#include <boost\log\trivial.hpp>
#include <boost\log\expressions.hpp>
#include <boost\log\utility\setup\file.hpp>
#include <boost\log\utility\setup\common_attributes.hpp>
namespace logging = boost::log ;
namespace src = boost::log::sources ;
namespace keywords= logging::keywords ;
namespace sinks = boost::log::sinks ;

void init_logger() {
        logging::add_file_log(
                "sample.log",
                keywords::rotation_size = 10 * 1024 * 1024,
                keywords::time_based_rotation = sinks::file::rotation_at_time_point(0,0,0),
                keywords::format = "[%TimeStamp%]: %Message%",
                keywords::auto_flush=true
                ) ;
        logging::core::get()->set_filter (logging::trivial::severity >= logging::trivial::info ) ;
        logging::core::get()->add_global_attribute("TimeStamp", boost::log::attributes::local_clock());
}
...

I compiled with the following command from my makefile:

cc -g -DCPU=PENTIUM -DMC68000 -DDoing2VxWorks -IC:\boost -I../source -I../include -MMD -MP -c -o obj\logLib.o logLib.cpp

Which I built with the following command from my makefile:

cc -g -DCPU=PENTIUM -DMC68000 -DDoing2VxWorks -IC:\boost -I../source -I../include -MMD -MP -c -o obj\logLib.o logLib.cpp
gfortran -o unit01test.exe obj\unit01test.o ..\mcpmain\obj\rtinit.o ..\mcpmain\obj\bite2.o ..\mcpmain\obj\bmain.o ..\mcpmain\obj\keypm2.o ..\mcpmain\obj\ksvc.o ..\mcpmain\obj\scen1.o ..\mcpmain\obj\disup.o ..\mcpmain\obj\idisup.o ..\mcpmain\obj\keyin.o ..\mcpmain\obj\disdr.o ..\mcpmain\obj\led_task.o ..\mcpmain\obj\spip_task.o ..\mcpmain\obj\iff_task.o ..\mcpmain\obj\inmsgmgr.o ..\mcpmain\obj\cppmainUnit01Test.o ..\runhistory\obj\rhlog_api.o ..\utilities\obj\main2aux.o ../../vxWorksLib/vxWorksLib/vxWorks/source/obj\logLib.o ../../vxWorksLib/vxWorksLib/vxWorks/source/obj\msgQlib.o ../../vxWorksLib/vxWorksLib/vxWorks/source/obj\pciConfigLib.o ../../vxWorksLib/vxWorksLib/vxWorks/source/obj\semLib.o ../../vxWorksLib/vxWorksLib/vxWorks/source/obj\sharedMemLib.o ../../vxWorksLib/vxWorksLib/vxWorks/source/obj\sockLib.o ../../vxWorksLib/vxWorksLib/vxWorks/source/obj\sysLib.o ../../vxWorksLib/vxWorksLib/vxWorks/source/obj\taskLib.o ../../vxWorksLib/vxWorksLib/vxWorks/source/obj\wdLib.o -LC:\boost\stage\lib -lboost_log_setup-mgw48-mt-d-1_61 -lboost_log-mgw48-mt-d-1_61 -lboost_thread-mgw48-mt-d-1_61 -lboost_system-mgw48-mt-d-1_61 -LC:\Windows\SysWOW\en-US -lws2_32 -lstdc++ -lboost_log_setup-mgw48-mt-d-1_61 -lboost_log-mgw48-mt-d-1_61

which gives me the error:

../../vxWorksLib/vxWorksLib/vxWorks/source/obj\logLib.o: In function `Z11init_loggerv':
c:\1PortMUTES2MinGW\ProjectRepository-Build\vxWorksLib\vxWorksLib\vxWorks\source/logLib.cpp:16: undefined reference to `boost::log::v2s_mt_nt5::sinks::file::rotation_at_time_point::rotation_at_time_point(unsigned char, unsigned char, unsigned char)'

But when I check the nm output, I find the following ::v2_mt_nt5:: namespace defined in all of the various forms of the Boost log libraries:

d000608.o:
         U _head_libboost_log_mgw48_mt_d_1_61_dll
00000000 I _imp___ZNK5boost3log9v2_mt_nt55sinks4file25rotation_at_time_intervalclEv
00000000 T boost::log::v2_mt_nt5::sinks::file::rotation_at_time_interval::operator()() const

I built my boost libraries using the directions for a MinGW build. I built my code using the same MinGW framework.

However, I found the reason for the two conflicting name spaces, v2_mt_nt5 and v2s_mt_nt5 at:

  http://www.boost.org/doc/libs/1_56_0/libs/log/doc/html/log/rationale/namespace_mangling.html

The magic key is to recognize the <linkage> name space. I resolved most of my Boost log problem by adding -DBOOST_ALL_DYN_LINK to the compile operation. The correct compile command is:

cc -g -DCPU=PENTIUM -DMC68000 -DDoing2VxWorks - DBOOST_ALL_DYN_LINK -IC:\boost -I../source -I../include -MMD -MP -c -o obj\logLib.o logLib.cpp

Note that I was able to resolve my remaining errors where gcc just listed the mangled symbol by grep'ing the library file.


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net