Warszawski Koks
Warszawski Koks

Reputation: 69

Cmake undefined reference to `boost::gregorian::greg_month::as_short_string() const'

I spend whole day trying to link the data_time library to my c++ cmake project.

So I am using cmake 3.4 and boost 1.61.0. I have the class where is a function which is taking local time:

void TestClass::getTime() {
    this->endDate = boost::posix_time::second_clock::local_time();
}

Then I want to return the value of endDate by function returning string:

string testCalss::Info() {
   return to_simple_string(this->beginningDate);   
}

I need to convert the type of endDate variable to string, because function is string type.

I am getting error messages while program is linking:

In function boost::date_time::month_formatter<boost::gregorian::greg_month, boost::date_time::simple_format<char>, char>::format_month(boost::gregorian::greg_month const&, std::ostream&)':
/usr/include/boost/date_time/date_formatting.hpp:44: undefined reference to `boost::gregorian::greg_month::as_short_string() const'
/usr/include/boost/date_time/date_formatting.hpp:49: undefined reference to `boost::gregorian::greg_month::as_long_string() const'

I have read that data_time is not only header-only library and I should build and add it to my project.

I have tried this command gcc myapp.cpp -omyapp -lboost_date_time, and it's does not work because I am using g++ in cmake project and I haven't find nothing for g++.

I also tried this:

c++ -I path/to/boost_1_61_0 example.cpp -o example \
   ~/boost/stage/lib/libboost_regex-gcc34-mt-d-1_36.a

Its example from official boost docs how to link libraries. In cmake project I have few cpp files. Should I run this command using file where is my converting command?

Is there any easier way to fix this error?

Upvotes: 2

Views: 1650

Answers (2)

Fenghe Xu
Fenghe Xu

Reputation: 181

cmake_minimum_required(VERSION 3.17)
project(boost_ptime)

set(CMAKE_CXX_STANDARD 17)

set(SOURCE_FILES main.cpp)

add_executable(boost_ptime ${SOURCE_FILES})

find_package( Boost 1.73 COMPONENTS date_time)
if(Boost_FOUND)
      include_directories(${Boost_INCLUDE_DIRS})
      target_link_libraries( boost_ptime ${Boost_DATE_TIME_LIBRARY} )
endif()

Thanks to Warszawski Koks, I was able to compile my program in this way. Above is the full CMakeLists.txt file.

Upvotes: 0

Warszawski Koks
Warszawski Koks

Reputation: 69

I found out how to solve the problem. The way I choose is simple. First of all I have used the locate */boost/date_time* command to find where is my boost and date_time libraries installed. I did not know what version of boost library I am using, so I used locate command again to find boost/version.hpp file. After that I added few lines to my CmakeLists.txt:

find_package( Boost 1.60.0 COMPONENTS date_time)
if(Boost_FOUND)
      include_directories(${Boost_INCLUDE_DIRS})
      target_link_libraries( Program ${Boost_DATE_TIME_LIBRARY} )
endif()

Thats all.

Upvotes: 1

Related Questions