Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
0.12.0
-
None
-
None
Description
With:
- CMake 3.13.4,
- g++ 4.8.5
- Boost 1.53.0
- thread
- chrono
- system
- date_time
- atomic
- apr-1.6.2
- apr-devel-1.6.2
- apr-util-1.6.0
- apr-util-devel-1.6.0
CMake fails to properly detect the Boost threads package, due to a link error in the test build. There is no indication of a problem at the CMake stage other than the lack of output for the shared_mutex implementation:
log4cxx configuration summary:
Build shared library ............ : ON
Build tests ..................... : ON
Build site ...................... : OFF
Install prefix .................. : /usr/local
C++ compiler .................... : /usr/bin/c++
log4cxx char API ................ : utf-8
log4cxx wchar API ............... : ON
log4cxx unichar API ............. : OFF
logchar type .................... : utf-8
charset ......................... : locale
Using libESMTP .................. : OFF
ODBC library .................... : OFF
syslog .......................... : ON
Qt support ...................... : OFF
shared_mutex implementation ..... :
This can be fixed by adding "-lboost_system" to CMAKE_CXX_FLAGS.
After correcting the CMake problem, a make may be performed, which results in the compiler complaining that mutex is not found in the std:: namespace in a number of places. This can be rectified by adding "#include <mutex>" to:
- log4cxx/src/main/include/log4cxx/helpers/appenderattachableimpl.h
- log4cxx/src/main/include/log4cxx/helpers/aprinitializer.h
- log4cxx/src/main/include/log4cxx/helpers/loglog.h
- log4cxx/src/main/include/log4cxx/helpers/serversocket.h
- log4cxx/src/main/include/log4cxx/level.h
- log4cxx/src/main/include/log4cxx/rolling/action.h
This may not be a minimal set, but it was sufficient to satisfy the build.
Once these problems have been addressed, the compiler complains that the C++ 17 feature "std::weak_from_this()" is not available. It is used in two places in log4cxx/src/main/cpp/hierarchy.cpp: line 226 and line 426.
It may be preferable to create a local routine that stands in for "std::weak_from_this()", but I found it sufficient to just #if / #else / #endif around the single line in each location that called weak_from_this() and replace it with a two-step version similar to this:
std::weak_ptr<Hierarchy> weak_handle = shared_from_this();
logger->setHierarchy(weak_handle);
in place of the single-step:
logger->setHierarchy(weak_from_this());
I used the precompiler test:
#if __cplusplus >= 201500L
That was sufficient to differentiate my g++ 4.8.5 from more modern compilers that support C++ 17, but there may be more precise ways of achieving this end - I just don't have the ability to test on anything other than g++ 4.8.5.
After making this change the build should complete successfully, and all 60/60 tests should pass.
NOTE: Because g++ 4.8.5 does not support std::shared_mutex and is therefore dependent on Boost thread, and Boost thread itself is dependent on Boost system, it was required to link executables using this version of log4cxx w/ Boost system as well. I suspect there may be Boost compile-time flags that might make that unnecessary, but my knowledge of Boost is not sufficient to achieve that goal.
Attachments
Issue Links
- links to