Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [paho-dev] Building the C++ API/samples

Hello Luja,

The issue we're discussing is the C++ library, not the C library. The C++ lib is currently written to mimic the Java API, and in order to do so, it makes heavy use of the new C++11 features - primarily new library components. As such, it requires a C++11-compliant compiler such as GCC 4.6 (or above), or DevStudio 2012. So we are discussing what - if anything - can be done to support earlier compilers (any which are roughly based on C++ 98).

It would be a lengthy process and a waste of our resources to rewrite the required parts of the new standard library just for the MQTT C++ library. So a convenient, if not optimal solution would be to allow user's to drop in Boost to replace the missing C++11 libraries for older compilers. They would be no bulkier than the new standard libraries.

But our original thinking was that, if this is too big or new, then you can always resort to the C library, even if your app is using C++ (98).

I should mention, however, that I have been delivering embedded ARM/Linux solutions for over 6 years using Boost. The average low-end board that can run Linux (like a RaspberryPi or Beaglebone) is quite sufficient for Boost. Ive used it on much smaller boards than that.

But, both the Paho C library and C++ library are assumed to run on a standard OS (Windows, Linux, etc). When we get down to the realm of bare-metal boards (like Arduino-class) or RTOS, we would need something different entirely. Something that makes careful use of dynamic memory, works with embedded C libraries and perhaps some of the more popular lightweight, embedded network stacks, like LwIP.


On 11/14/2013 10:35 AM, luja wrote:
Please keep it simple and self-sufficient. Creating dependencies makes a
project more complex and more difficult to port to small architectures
like microcontrollers.
At least the plain c implementation should be as simple as possible w/o
dependencies to bulky libs
like boost.



On 11/14/2013 3:20 PM, Frank Pagliughi wrote:
Sounds good. I have been working on an update - though, admittedly, a
bit slowly.  I'd appreciate any feedback.


On 11/13/2013 04:24 PM, Ian Craggs wrote:

I am happy with that approach.  It's nice to be able to use recent
language features without having to wait 5 or 6 years!  And as you
say, we have the C library to fall back on - after all, the C library
is C rather than C++ because template support just didn't work in gcc
when I started writing the first implementation.

Making it Boost compatible is up to you.  Personally I'm more
interested in automated build and tests.  And we obviously ought to
make it clear in big letters that it needs C++11 and what the options
are otherwise.

What I would say is that I think before making the C++ library a
"first class" citizen of Paho, we would have to wait until we can
build and test it for Linux at least in the Eclipse build
infrastructure.   I'll probably raise a(nother) bug request and see
how that goes down!  (I already have a bug open on Windows/Mac builds
which is an ongoing discussion).

Now I'll dig out my own machine with a recent Linux OS on it...


On 13/11/13 18:53, Frank Pagliughi wrote:
Hello Ian,

Yes, several people asked me about this, particularly people stuck
with an older cross-compiler for an embedded system. Including me,
as it turns out! The earliest GCC I suspect that would work is 4.6.
For Windows, DevStudio 2012 is needed (though I still have to do
more testing on Windows to be sure this works properly).

The implementation makes heavy use of the C++11 libraries - threads,
sync objects, time (chrono), and shared pointers. When we discussed
this prior to my submission last spring, everyone seemed OK to
proceed along these lines as we could "look forward" with the C++
implementation, since people could fall back to the C library if

I was, however, going to investigate using Boost for older compilers
- so Boost would *not* be needed (at all) for a C++11 compiler, but
could be used for an older compiler. It has nearly drop-in
replacements for threading, time/chrono, and shared pointer
libraries. I would still need to change/remove a few of the new
language features (nullptr, noexcept, etc).

But without using Boost, the required changes/additions would be a
lot of work.

To be clear, we would not need to ship any boost code (no licensing
issues), but anyone with GCC <= 4.5 or VisualStudio <= 2010, could
still use the Paho C++ library with Boost as an external
requirement. And since Boost can be cross-compiled easily enough,
this is a viable solution for embedded cross-compiled targets.

What do you think of that?


On 11/13/2013 11:27 AM, Ian Craggs wrote:
Hi Frank,

trying to build the C++ samples on my RedHat workstation, I get the
output included below. At least the first one is presumably due to
the older version of gcc installed (4.4.7-3) - I haven't looked at
the rest yet. But the version of gcc installed on at least one of
the Eclipse build servers is older than that (4.3.4).

Should/could we have a solution for pre C++11 compilers?


g++ -I.. -I../../../org.eclipse.paho.mqtt.c/src -D_NDEBUG -Wall
-std=c++0x -O2 -o async_publish async_publish.cpp -L../lib
-L../../../org.eclipse.paho.mqtt.c/src/linux_ia64 -lmqttpp -lmqttv3a
In file included from ../mqtt/token.h:32,
from ../mqtt/async_client.h:31,
from async_publish.cpp:23:
../mqtt/exception.h:73: error: expected ‘;’ before ‘noexcept’
../mqtt/exception.h:76: error: expected ‘;’ before ‘}’ token
In file included from ../mqtt/async_client.h:31,
from async_publish.cpp:23:
../mqtt/token.h: In member function ‘bool
std::chrono::time_point<_Clock, _Duration1>&)’:
../mqtt/token.h:315: error: expected primary-expression before ‘[’
In file included from ../mqtt/async_client.h:35,
from async_publish.cpp:23:
../mqtt/connect_options.h: In constructor
../mqtt/connect_options.h:63: error: could not convert ‘{{'M', 'Q',
'T', 'C'}, 2, 60, 1, 10, 0l, 0l, 0l, 30, 20, 0l, 0l, 0, 0l}’ to
async_publish.cpp: In function ‘void sleep(int)’:
async_publish.cpp:38: error: ‘sleep_for’ is not a member of
async_publish.cpp: In function ‘int main(int, char**)’:
async_publish.cpp:143: error: ‘nullptr’ was not declared in this scope

paho-dev mailing list

paho-dev mailing list

Back to the top