Skip to content

pubnub_version_posix.cpp: missing extern "C" causes linker failure when building with WITH_CPP=ON #242

@spectrbro

Description

@spectrbro

Hi,

I have had trouble compiling pubnub with cmake the last days and think I narrowed it down to a problem in:

  • c-core/cpp/pubnub_version_posix.cpp

The compiler kept spitting out the following:

Undefined symbols for architecture arm64:
  "_pubnub_sdk_name", referenced from:
      _pbcc_uname in libpubnub.a[6](pubnub_ccore_pubsub.c.o)
      _pbcc_publish_prep in libpubnub.a[6](pubnub_ccore_pubsub.c.o)
      _pbcc_signal_prep in libpubnub.a[6](pubnub_ccore_pubsub.c.o)
      _pbcc_subscribe_prep in libpubnub.a[6](pubnub_ccore_pubsub.c.o)
  "_pubnub_uagent", referenced from:
      _pbnc_fsm in libpubnub.a[8](pubnub_netcore.c.o)
  "_pubnub_uname", referenced from:
      _pbcc_uname in libpubnub.a[6](pubnub_ccore_pubsub.c.o)
      _pbcc_publish_prep in libpubnub.a[6](pubnub_ccore_pubsub.c.o)
      _pbcc_signal_prep in libpubnub.a[6](pubnub_ccore_pubsub.c.o)
      _pbcc_subscribe_prep in libpubnub.a[6](pubnub_ccore_pubsub.c.o)
ld: symbol(s) not found for architecture arm64

Running nm c-core/libpubnub-cpp.a | grep -E "uname|uagent|sdk_name" (after building) listed the following:

0000000000000018 T __Z12pubnub_unamev
0000000000000024 T __Z13pubnub_uagentv
0000000000000000 T __Z15pubnub_sdk_namev

I simply added (to pubnub_version_posix.cpp):

#if PUBNUB_USE_EXTERN_C
extern "C" {
#endif
#include "core/pubnub_version.h"
#include "core/pubnub_version_internal.h"
#if PUBNUB_USE_EXTERN_C
}
#endif

and now it seems to compile just fine.

nm c-core/libpubnub-cpp.a | grep -E "uname|uagent|sdk_name" now lists the proper symbol that is looked for:

0000000000000000 T _pubnub_sdk_name
0000000000000024 T _pubnub_uagent
0000000000000018 T _pubnub_uname

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions