Im new to Tango software. Im trying to compile tango on Arch linux for my project. I tried to install it from Arch aur repositories without success. I got same during manual compilation. Below you can see part of error trace.
make[5]: Entering directory '/home/arek/.cache/yay/tango/src/tango-9.3.4/lib/cpp/client'
CXX dbapi_class.lo
CXX dbapi_server.lo
CXX dbapi_datum.lo
CXX dbapi_base.lo
CXX dbapi_device.lo
CXX dbapi_history.lo
CXX dbapi_attribute.lo
CXX dbapi_cache.lo
CXX dbapi_serverdata.lo
CXX devapi_attr.lo
CXX devapi_base.lo
CXX devapi_data.lo
devapi_data.cpp: In function ‘std::ostream& Tango::operator<<(std::ostream&, Tango::DeviceData&)’:
devapi_data.cpp:2330:24: error: ambiguous overload for ‘operator>>=’ (operand types are ‘CORBA::Any_var’ and ‘long long int’)
2330 | dd.any >>= ll_tmp;
| ~~~~~~~^~~~~~~~~~
In file included from /usr/include/omniORB4/CORBA.h:116,
from ../../../lib/cpp/server/idl/tango.h:6,
from ../../../lib/cpp/server/tango.h:46,
from devapi_data.cpp:35:
/usr/include/omniORB4/CORBA_Any_vartypes.h:182:18: note: candidate: ‘CORBA::Boolean CORBA::Any_var::operator>>=(CORBA::Short&) const’ (near match)
182 | inline Boolean operator>>=(Short& s) const {
| ^~~~~~~~
/usr/include/omniORB4/CORBA_Any_vartypes.h:182:18: note: conversion of argument 1 would be ill-formed:
devapi_data.cpp:2330:28: error: cannot bind non-const lvalue reference of type ‘CORBA::Short&’ {aka ‘short int&’} to a value of type ‘long long int’
2330 | dd.any >>= ll_tmp;
| ^~~~~~
In file included from /usr/include/omniORB4/CORBA.h:116,
from ../../../lib/cpp/server/idl/tango.h:6,
from ../../../lib/cpp/server/tango.h:46,
from devapi_data.cpp:35:
/usr/include/omniORB4/CORBA_Any_vartypes.h:185:18: note: candidate: ‘CORBA::Boolean CORBA::Any_var::operator>>=(CORBA::UShort&) const’ (near match)
185 | inline Boolean operator>>=(UShort& u) const {
| ^~~~~~~~
/usr/include/omniORB4/CORBA_Any_vartypes.h:185:18: note: conversion of argument 1 would be ill-formed:
devapi_data.cpp:2330:28: error: cannot bind non-const lvalue reference of type ‘CORBA::UShort&’ {aka ‘short unsigned int&’} to a value of type ‘long long int’
2330 | dd.any >>= ll_tmp;
| ^~~~~~
In file included from /usr/include/omniORB4/CORBA.h:116,
from ../../../lib/cpp/server/idl/tango.h:6,
from ../../../lib/cpp/server/tango.h:46,
from devapi_data.cpp:35:
/usr/include/omniORB4/CORBA_Any_vartypes.h:188:18: note: candidate: ‘CORBA::Boolean CORBA::Any_var::operator>>=(CORBA::Long&) const’ (near match)
188 | inline Boolean operator>>=(Long& l) const {
| ^~~~~~~~
/usr/include/omniORB4/CORBA_Any_vartypes.h:188:18: note: conversion of argument 1 would be ill-formed:
devapi_data.cpp:2330:28: error: cannot bind non-const lvalue reference of type ‘CORBA::Long&’ {aka ‘int&’} to a value of type ‘long long int’
2330 | dd.any >>= ll_tmp;
| ^~~~~~
In file included from /usr/include/omniORB4/CORBA.h:116,
from ../../../lib/cpp/server/idl/tango.h:6,
from ../../../lib/cpp/server/tango.h:46,
from devapi_data.cpp:35:
/usr/include/omniORB4/CORBA_Any_vartypes.h:191:18: note: candidate: ‘CORBA::Boolean CORBA::Any_var::operator>>=(CORBA::ULong&) const’ (near match)
191 | inline Boolean operator>>=(ULong& u) const {
| ^~~~~~~~
/usr/include/omniORB4/CORBA_Any_vartypes.h:191:18: note: conversion of argument 1 would be ill-formed:
devapi_data.cpp:2330:28: error: cannot bind non-const lvalue reference of type ‘CORBA::ULong&’ {aka ‘unsigned int&’} to a value of type ‘long long int’
2330 | dd.any >>= ll_tmp;
For me it looks like sime corba version issue. Did anyone had similar issues ? Any hints on how to solve it ?
Are you trying to compile on 32 bits?
It looks like ll_tmp is defined as a long long in your use case, meaning TANGO_LONG32 is defined.
TANGO_LONG32 is defined when the sizeof of a long is 8.
Could you please confirm you’re trying to build in 32 bits?
What version of CORBA are you using? Is it a 32 bits version too?
Or maybe im doing it wrong ? I also tried to build with host=i686 and some others and i got same issue. Any hints on that ? Is there anything that i could provide you which would help to analyze it ?
My Tango source is from latest release from tango web for linux.
/* The size of `bool', as computed by sizeof. */
#define SIZEOF_BOOL 1
/* The size of `char', as computed by sizeof. */
#define SIZEOF_CHAR 1
/* The size of `double', as computed by sizeof. */
#define SIZEOF_DOUBLE 8
/* The size of `float', as computed by sizeof. */
#define SIZEOF_FLOAT 4
/* The size of `int', as computed by sizeof. */
#define SIZEOF_INT 4
/* The size of `long', as computed by sizeof. */
#define SIZEOF_LONG 8
/* The size of `long double', as computed by sizeof. */
#define SIZEOF_LONG_DOUBLE 16
/* The size of `long long', as computed by sizeof. */
#define SIZEOF_LONG_LONG 8
/* The size of `short', as computed by sizeof. */
#define SIZEOF_SHORT 2
/* The size of `unsigned char', as computed by sizeof. */
#define SIZEOF_UNSIGNED_CHAR 1
/* The size of `void*', as computed by sizeof. */
#define SIZEOF_VOIDP 8
/* The size of `wchar_t', as computed by sizeof. */
#define SIZEOF_WCHAR_T 4
Is it correct that LONG and LONG LONG have same sizes ?
Ohhh i found that i have more of those files. In /usr/include/omniORB4/acconfig.h i found tha it uses some OMNI_ prefix. I guese that’s the default header file that is used during forte compilation.
/* The size of `bool', as computed by sizeof. */
#define OMNI_SIZEOF_BOOL 1
/* The size of `char', as computed by sizeof. */
#define OMNI_SIZEOF_CHAR 1
/* The size of `double', as computed by sizeof. */
#define OMNI_SIZEOF_DOUBLE 8
/* The size of `float', as computed by sizeof. */
#define OMNI_SIZEOF_FLOAT 4
/* The size of `int', as computed by sizeof. */
#define OMNI_SIZEOF_INT 4
/* The size of `long', as computed by sizeof. */
#define OMNI_SIZEOF_LONG 8
/* The size of `long double', as computed by sizeof. */
#define OMNI_SIZEOF_LONG_DOUBLE 16
/* The size of `long long', as computed by sizeof. */
#define OMNI_SIZEOF_LONG_LONG 8
/* The size of `short', as computed by sizeof. */
#define OMNI_SIZEOF_SHORT 2
/* The size of `unsigned char', as computed by sizeof. */
#define OMNI_SIZEOF_UNSIGNED_CHAR 1
/* The size of `void*', as computed by sizeof. */
#define OMNI_SIZEOF_VOIDP 8
/* The size of `wchar_t', as computed by sizeof. */
#define OMNI_SIZEOF_WCHAR_T 4
/* Define to the type of getsockname's third argument */
#define OMNI_SOCKNAME_SIZE_T socklen_t
Im not sure but it looks like default package from AUR is 4.3.0.1 AUR (en) - omniorb I also did quick test with adding those defines without prefixes below and it works i can compile it. But it’s not a best way to edit include files The question is if i didn’t mess up something by doing that.
You’ll probably have to wait for cppTango 9.4 (9.4.0 should be released on 2nd October 2022. Not sure that omniORB 4.3 will be already supported).
Could you install omniORB4.2.x on your system instead?
You might be able to use --omni option (with 2 dashes) when running configure to specify a non-standard omniORB install location.
The following environment variables might be useful too.
omniORB4_CFLAGS
C compiler flags for omniORB4, overriding pkg-config
omniORB4_LIBS
linker flags for omniORB4, overriding pkg-config
omniCOS4_CFLAGS
C compiler flags for omniCOS4, overriding pkg-config
omniCOS4_LIBS
linker flags for omniCOS4, overriding pkg-config
You can get all these options and environment variables by running configure --help (2 dashes here).
I’m not 100% sure that it will bypass the omniORB 4.3 version installed on your system but it might be worth a try.