[zeromq-dev] Revisited: Example for building against ZMQ with CMake + UDP Multicast Support

Bill Torpey wallstprog at gmail.com
Wed Sep 26 17:58:09 CEST 2018


Hi Luca:

The problem, for me at least, is that some of the library versions required by the packaged ZeroMQ are not native for the target OS.  

For instance, the 4.2.5 distro for RH6 requires libsodium.so.18, while the native version on RH6 is libsodium.so.4.  A similar situation exists with openpgm, and to make things worse I don’t need or want either of these on my production servers.

The policy in my shop is to avoid franken-OS’s at all costs — we do not install *anything* that is not included as part of the base OS in standard locations (e.g., /usr).  Anything of that sort that *does* need to be installed is *always* built from source using the same build/deploy infrastructure we use for our own applications and deployed to /opt.  That provides a separation between OS and application that we require for, among other things, ISO 27001 certification, which our customers demand.  (It also makes the SE’s jobs at least tolerable, since they can always re-install the base OS “from scratch” without needing to track custom packages/versions). 

So I guess my question is whether the newer versions of the dependent libs are required for a particular reason?  If so, is that reason documented somewhere?  Because if it is, I need to start building and deploying that specific version.  If not, then I can stick with using the native version supplied by the OS .

Thanks!

Bill


> On Sep 26, 2018, at 11:36 AM, Luca Boccassi <luca.boccassi at gmail.com> wrote:
> 
> In case the base system is missing a dependency, everything that is
> needed is shipped in the same repository where the library can be
> found, and kept up to date.
> Please do not recommend to avoid repositories - it's the preferred form
> of distribution for Linux users.
> 
> On Wed, 2018-09-26 at 11:22 -0400, Bill Torpey wrote:
>> So I guess you could use the static lib, but that may not be ideal.
>> 
>> Personally I’ve had problems with the packaged builds — e.g., the RH
>> builds require specific versions of dependent libs that are not
>> native to the OS.  For that reason, among others, I build libzmq from
>> source.  That’s not easy either, but at least you know what you’re
>> getting.
>> 
>> FWIW, here’s a snip from the build script that I use — you will
>> obviously need to make changes for your environment, but it’s a
>> start.  
>> 
>> # delete old build
>> rm -rf build
>> mkdir build
>> cd build
>> 
>> # do the build
>> cmake -DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX}
>> -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \
>>    -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
>>    -DENABLE_DRAFTS=On \
>>    -DBUILD_STATIC=Off \
>>    -DWITH_OPENPGM=Off \
>>    ..
>> rc=$?
>> [[ $rc != 0 ]] && exit $rc
>> 
>> make ${VERBOSE} && make ${VERBOSE} install
>> rc=$?
>> [[ $rc != 0 ]] && exit $rc
>> 
>> 
>> # copy source to facilitate debugging
>> mkdir -p ${INSTALL_PREFIX}/src
>> cp -rp ../src ${INSTALL_PREFIX}/
>> 
>> 
>>> On Sep 26, 2018, at 11:10 AM, Stephan again <opfer at vs.uni-kassel.de
>>>> wrote:
>>> 
>>> And the static library installed from this repository seems to have
>>> the draft api included. Here is the test for that: 
>>> nm -gC /usr/lib/x86_64-linux-gnu/libzmq.a | grep zmq_msg_group
>>> 
>>> nm: src_libzmq_la-devpoll.o: no symbols
>>> nm: src_libzmq_la-gssapi_mechanism_base.o: no symbols
>>> nm: src_libzmq_la-gssapi_client.o: no symbols
>>> nm: src_libzmq_la-gssapi_server.o: no symbols
>>> nm: src_libzmq_la-kqueue.o: no symbols
>>> nm: src_libzmq_la-poll.o: no symbols
>>> nm: src_libzmq_la-pollset.o: no symbols
>>> nm: src_libzmq_la-precompiled.o: no symbols
>>> nm: src_libzmq_la-select.o: no symbols
>>> nm: src_libzmq_la-vmci.o: no symbols
>>> nm: src_libzmq_la-vmci_address.o: no symbols
>>> nm: src_libzmq_la-vmci_connecter.o: no symbols
>>> nm: src_libzmq_la-vmci_listener.o: no symbols
>>> 0000000000000fb0 T zmq_msg_group(zmq_msg_t*) <- matched
>>> 
>>> Kind Regards
>>> 
>>>   Stephan
>>> 
>>> On 26.09.2018 17:05, Stephan again wrote:
>>>> I Installed it from:
>>>> 
>>>> http://download.opensuse.org/repositories/network:/messaging:/zer
>>>> omq:/release-draft/xUbuntu_18.04/
>>>> <http://download.opensuse.org/repositories/network:/messaging:/ze <http://download.opensuse.org/repositories/network:/messaging:/ze>
>>>> romq:/release-draft/xUbuntu_18.04/>
>>>> Hoping that it was compiled accordingly...
>>>> 
>>>> This: 
>>>> g++ Discovery.cpp /usr/lib/x86_64-linux-gnu/libzmq.a -lpthread
>>>> -DZMQ_BUILD_DRAFT_API=1 -DENABLE_DRAFTS=On -o test
>>>> 
>>>> makes it even worth:
>>>> 
>>>> /usr/lib/x86_64-linux-gnu/libzmq.a(src_libzmq_la-socket_base.o):
>>>> In function `zmq::socket_base_t::connect(char const*)':
>>>> (.text+0x4b26): undefined reference to `pgm_freeaddrinfo'
>>>> /tmp/cc62suQj.o: In function `msg_send(zmq_msg_t*, void*, char
>>>> const*, char const*)':
>>>> Discovery.cpp:(.text+0x8e): undefined reference to
>>>> `zmq_msg_set_group'
>>>> /tmp/cc62suQj.o: In function `msg_recv_cmp(zmq_msg_t*, void*,
>>>> char const*, char const*)':
>>>> Discovery.cpp:(.text+0x148): undefined reference to
>>>> `zmq_msg_group'
>>>> /tmp/cc62suQj.o: In function `main':
>>>> Discovery.cpp:(.text+0x30e): undefined reference to `zmq_leave'
>>>> Discovery.cpp:(.text+0x37f): undefined reference to `zmq_join'
>>>> Discovery.cpp:(.text+0x3c3): undefined reference to `zmq_join'
>>>> Discovery.cpp:(.text+0x407): undefined reference to `zmq_join'
>>>> Discovery.cpp:(.text+0x57c): undefined reference to `zmq_join'
>>>> Discovery.cpp:(.text+0x668): undefined reference to `zmq_leave'
>>>> /usr/lib/x86_64-linux-gnu/libzmq.a(src_libzmq_la-zmq_utils.o): In
>>>> function `zmq_curve_keypair':
>>>> (.text+0x3e6): undefined reference to `crypto_box_keypair'
>>>> /usr/lib/x86_64-linux-gnu/libzmq.a(src_libzmq_la-zmq_utils.o): In
>>>> function `zmq_curve_public':
>>>> (.text+0x482): undefined reference to `crypto_scalarmult_base'
>>>> /usr/lib/x86_64-linux-gnu/libzmq.a(src_libzmq_la-ip.o): In
>>>> function `zmq::initialize_network()':
>>>> (.text+0x480): undefined reference to `pgm_init'
>>>> (.text+0x511): undefined reference to `pgm_error_free'
>>>> /usr/lib/x86_64-linux-gnu/libzmq.a(src_libzmq_la-ip.o): In
>>>> function `zmq::shutdown_network()':
>>>> (.text+0x585): undefined reference to `pgm_shutdown'
>>>> /usr/lib/x86_64-linux-gnu/libzmq.a(src_libzmq_la-random.o): In
>>>> function `zmq::random_open()':
>>>> (.text+0x95): undefined reference to `sodium_init'
>>>> /usr/lib/x86_64-linux-gnu/libzmq.a(src_libzmq_la-random.o): In
>>>> function `zmq::random_close()':
>>>> (.text+0xc1): undefined reference to `randombytes_close'
>>>> /usr/lib/x86_64-linux-gnu/libzmq.a(src_libzmq_la-pgm_socket.o):
>>>> In function `zmq::pgm_socket_t::init_address(char const*,
>>>> pgm_addrinfo_t**, unsigned short*)':
>>>> (.text+0x17e): undefined reference to `pgm_getaddrinfo'
>>>> (.text+0x26f): undefined reference to `pgm_error_free'
>>>> 
>>>> ....
>>>> 
>>>> Kind Regards
>>>> 
>>>>   Stephan
>>>> 
>>>> 
>>>> On 26.09.2018 16:55, Jake wrote:
>>>>> ZeroMQ itself needs to be compiled with ENABLE_DRAFTS in
>>>>> CMake.  You've added it to the compiler flags when building
>>>>> your own application.  Did you compile ZeroMQ yourself or are
>>>>> you using a distro-provided version?
>>>>> 
>>>>> For the static library, one way is to give the full path to the
>>>>> .a file instead of using -lzmq.  gcc default behavior prefers
>>>>> the shared object when both are present.
>>>>> 
>>>>> -Jake
>>>>> 
>>>>> 
>>>>> On Wed, Sep 26, 2018 at 10:51 AM Stephan again <opfer at vs.uni <mailto:opfer at vs.uni>-ka
>>>>> ssel.de <http://ssel.de/> <mailto:opfer at vs.uni-kassel.de <mailto:opfer at vs.uni-kassel.de>>> wrote:
>>>>> Hi Bill,
>>>>> 
>>>>> adding -DENABLE_DRAFTS=On does not help:
>>>>> 
>>>>> g++ Discovery.cpp -lzmq -DZMQ_BUILD_DRAFT_API=1
>>>>> -DENABLE_DRAFTS=On -o test
>>>>> 
>>>>> I also checked my installed libraries with "nm -gC <library |
>>>>> grep zmq_msgs_group":
>>>>> 
>>>>> /usr/lib/x86_64-linux-gnu/libzmq.a -> match
>>>>> /usr/lib/x86_64-linux-gnu/libzmq.so -> no match
>>>>> /usr/lib/x86_64-linux-gnu/libzmq.so.5 -> no match
>>>>> /usr/lib/x86_64-linux-gnu/libzmq.so.5.1.5 -> no match
>>>>> 
>>>>> I am not so into this dynamic and static library stuff, but my
>>>>> build chain is linking agains "/usr/lib/x86_64-linux-
>>>>> gnu/libzmq.so". Is that the problem? How do I force it on
>>>>> command line to link against the static version.
>>>>> 
>>>>> Kind Regards
>>>>> 
>>>>>   Stephan
>>>>> 
>>>>> On 26.09.2018 16:08, Bill Torpey wrote:
>>>>>> Hi Stephan:
>>>>>> 
>>>>>> The RADIO/DISH sockets are considered DRAFT, which is
>>>>>> probably why you’re getting these errors.
>>>>>> 
>>>>>> There are a couple of possibilities:
>>>>>> 
>>>>>> - You may be linking against a version of libzmq that doesn’t
>>>>>> include the draft APIs.  In order to build with draft
>>>>>> support, the build needs to specify "-DENABLE_DRAFTS=On” on
>>>>>> the cmake command line.  Make sure your libzmq was built with
>>>>>> support for the draft APIs.
>>>>>> 
>>>>>> 
>>>>>> - You also need to enable draft APIs in your code, similar to
>>>>>> following:
>>>>>> 
>>>>>> #define ZMQ_BUILD_DRAFT_API
>>>>>> #include <zmq.h>
>>>>>> 
>>>>>> The #define makes the draft APIs visible to your code.
>>>>>> 
>>>>>> (Never mind — you’re already doing this on the compile
>>>>>> command).
>>>>>> 
>>>>>> Hope this helps.
>>>>>> 
>>>>>> Bill
>>>>>> 
>>>>>>> On Sep 26, 2018, at 9:13 AM, Stephan again <opfer at vs.uni <mailto:opfer at vs.uni>-ka
>>>>>>> ssel.de <http://ssel.de/> <mailto:opfer at vs.uni-kassel.de <mailto:opfer at vs.uni-kassel.de>>> wrote:
>>>>>>> 
>>>>>>> Hi,
>>>>>>> 
>>>>>>> I asked this question/issue one and a half year ago (https:
>>>>>>> //lists.zeromq.org/mailman/private/zeromq-dev/2017- <http://lists.zeromq.org/mailman/private/zeromq-dev/2017->
>>>>>>> January/031309.html
>>>>>>> <https://lists.zeromq.org/mailman/private/zeromq-dev/2017- <https://lists.zeromq.org/mailman/private/zeromq-dev/2017->
>>>>>>> January/031309.html>). The difference is that I now would
>>>>>>> like to use zeromq (draft api) version 4.2.5 under Ubuntu
>>>>>>> 18.04.
>>>>>>> 
>>>>>>> My minimal (not) working example can be found here: https:/
>>>>>>> /gist.github.com/StephanOpfer/5b9f3f76e6610536078cb9c16072a <http://gist.github.com/StephanOpfer/5b9f3f76e6610536078cb9c16072a>
>>>>>>> ac9
>>>>>>> <https://gist.github.com/StephanOpfer/5b9f3f76e6610536078cb <https://gist.github.com/StephanOpfer/5b9f3f76e6610536078cb>
>>>>>>> 9c16072aac9>
>>>>>>> 
>>>>>>> Compiling it with this command:
>>>>>>> 
>>>>>>>     g++ Discovery.cpp -lzmq -DZMQ_BUILD_DRAFT_API=1 -o test
>>>>>>> 
>>>>>>> produces this:
>>>>>>> 
>>>>>>>     /tmp/ccUwelWs.o: In function `msg_send(zmq_msg_t*,
>>>>>>> void*, char const*, char const*)':
>>>>>>>     Discovery.cpp:(.text+0x8e): undefined reference to
>>>>>>> `zmq_msg_set_group'
>>>>>>>     /tmp/ccUwelWs.o: In function `msg_recv_cmp(zmq_msg_t*,
>>>>>>> void*, char const*, char const*)':
>>>>>>>     Discovery.cpp:(.text+0x148): undefined reference to
>>>>>>> `zmq_msg_group'
>>>>>>>     /tmp/ccUwelWs.o: In function `main':
>>>>>>>     Discovery.cpp:(.text+0x30e): undefined reference to
>>>>>>> `zmq_leave'
>>>>>>>     Discovery.cpp:(.text+0x37f): undefined reference to
>>>>>>> `zmq_join'
>>>>>>>     Discovery.cpp:(.text+0x3c3): undefined reference to
>>>>>>> `zmq_join'
>>>>>>>     Discovery.cpp:(.text+0x407): undefined reference to
>>>>>>> `zmq_join'
>>>>>>>     Discovery.cpp:(.text+0x57c): undefined reference to
>>>>>>> `zmq_join'
>>>>>>>     Discovery.cpp:(.text+0x668): undefined reference to
>>>>>>> `zmq_leave'
>>>>>>>     collect2: error: ld returned 1 exit status
>>>>>>> 
>>>>>>> Any help is welcome. :)
>>>>>>> 
>>>>>>> Kind Regards
>>>>>>> 
>>>>>>>   Stephan
>>>>>>> 
>>>>>>> 
>>>>>>> _______________________________________________
>>>>>>> zeromq-dev mailing list
>>>>>>> zeromq-dev at lists.zeromq.org <mailto:zeromq-dev at lists.zeromq.org> <mailto:zeromq-dev at lists.zeromq <mailto:zeromq-dev at lists.zeromq>
>>>>>>> .org>
>>>>>>> https://lists.zeromq.org/mailman/listinfo/zeromq-dev <https://lists.zeromq.org/mailman/listinfo/zeromq-dev>
>>>>>>> <https://lists.zeromq.org/mailman/listinfo/zeromq-dev <https://lists.zeromq.org/mailman/listinfo/zeromq-dev>>
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> _______________________________________________
>>>>>> zeromq-dev mailing list
>>>>>> zeromq-dev at lists.zeromq.org <mailto:zeromq-dev at lists.zeromq.org> <mailto:zeromq-dev at lists.zeromq.o <mailto:zeromq-dev at lists.zeromq.o>
>>>>>> rg>
>>>>>> https://lists.zeromq.org/mailman/listinfo/zeromq-dev <https://lists.zeromq.org/mailman/listinfo/zeromq-dev>
>>>>>> <https://lists.zeromq.org/mailman/listinfo/zeromq-dev <https://lists.zeromq.org/mailman/listinfo/zeromq-dev>>
>>>>> 
>>>>> _______________________________________________
>>>>> zeromq-dev mailing list
>>>>> zeromq-dev at lists.zeromq.org <mailto:zeromq-dev at lists.zeromq.org> <mailto:zeromq-dev at lists.zeromq.org <mailto:zeromq-dev at lists.zeromq.org>
>>>>>> 
>>>>> https://lists.zeromq.org/mailman/listinfo/zeromq-dev <https://lists.zeromq.org/mailman/listinfo/zeromq-dev>
>>>>> <https://lists.zeromq.org/mailman/listinfo/zeromq-dev <https://lists.zeromq.org/mailman/listinfo/zeromq-dev>>
>>>>> 
>>>>> 
>>>>> _______________________________________________
>>>>> zeromq-dev mailing list
>>>>> zeromq-dev at lists.zeromq.org <mailto:zeromq-dev at lists.zeromq.org> <mailto:zeromq-dev at lists.zeromq.org <mailto:zeromq-dev at lists.zeromq.org>
>>>>>> 
>>>>> https://lists.zeromq.org/mailman/listinfo/zeromq-dev <https://lists.zeromq.org/mailman/listinfo/zeromq-dev>
>>>>> <https://lists.zeromq.org/mailman/listinfo/zeromq-dev <https://lists.zeromq.org/mailman/listinfo/zeromq-dev>>
>>>> 
>>>> 
>>>> 
>>>> _______________________________________________
>>>> zeromq-dev mailing list
>>>> zeromq-dev at lists.zeromq.org <mailto:zeromq-dev at lists.zeromq.org> <mailto:zeromq-dev at lists.zeromq.org <mailto:zeromq-dev at lists.zeromq.org>>
>>>> https://lists.zeromq.org/mailman/listinfo/zeromq-dev <https://lists.zeromq.org/mailman/listinfo/zeromq-dev>
>>>> <https://lists.zeromq.org/mailman/listinfo/zeromq-dev <https://lists.zeromq.org/mailman/listinfo/zeromq-dev>>
>>> 
>>> _______________________________________________
>>> zeromq-dev mailing list
>>> zeromq-dev at lists.zeromq.org <mailto:zeromq-dev at lists.zeromq.org>
>>> https://lists.zeromq.org/mailman/listinfo/zeromq-dev <https://lists.zeromq.org/mailman/listinfo/zeromq-dev>
>> 
>> _______________________________________________
>> zeromq-dev mailing list
>> zeromq-dev at lists.zeromq.org <mailto:zeromq-dev at lists.zeromq.org>
>> https://lists.zeromq.org/mailman/listinfo/zeromq-dev <https://lists.zeromq.org/mailman/listinfo/zeromq-dev>
> 
> -- 
> Kind regards,
> Luca Boccassi_______________________________________________
> zeromq-dev mailing list
> zeromq-dev at lists.zeromq.org <mailto:zeromq-dev at lists.zeromq.org>
> https://lists.zeromq.org/mailman/listinfo/zeromq-dev <https://lists.zeromq.org/mailman/listinfo/zeromq-dev>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20180926/6edc54a3/attachment.htm>


More information about the zeromq-dev mailing list