Particular recipes¶
- Table of contents
- Particular recipes
- Missing d_type of struct dirent
- struct ifreq
- Too many arguments to function ‘getpwuid_r’, etc.
- Missing strverscmp()
- Debian symbols file
- Getting stack boundaries
- Getting path of executable
- Conflicting declarations of abs() in C++ sources
- Missing IXDR_GET_LONG or similar *_LONG RPC macros
- Boost threads unavailable on this platform
Missing d_type of struct dirent¶
Synopsis:
inputoutput.cpp:82:27: error: ‘struct dirent’ has no member named ‘d_type’; did you mean ‘d_name’?
if (dirp->d_type == DT_REG)
^~~~~~
inputoutput.cpp:82:37: error: ‘DT_REG’ was not declared in this scope
if (dirp->d_type == DT_REG)
^~~~~~
Solution is to use dirfd and fstatat, as shown below.
Note that decent programs should use stat/fstat/fstatat anyway, because not checking d_type == DT_UNKNOWN is a bug!
--- opencv-2.4.9.1+dfsg1.orig/modules/contrib/src/inputoutput.cpp
+++ opencv-2.4.9.1+dfsg1/modules/contrib/src/inputoutput.cpp
@@ -7,6 +7,7 @@
#include <tchar.h>
#else
#include <dirent.h>
+ #include <sys/stat.h>
#endif
namespace cv
@@ -72,14 +73,18 @@ namespace cv
(void)addPath;
DIR *dp;
struct dirent *dirp;
+ int dfd;
+ struct stat st;
if((dp = opendir(path.c_str())) == NULL)
{
return list;
}
+ dfd = dirfd(dp);
while ((dirp = readdir(dp)) != NULL)
{
- if (dirp->d_type == DT_REG)
+ if ((0 == fstatat(dfd, dirp->d_name, &st, 0)) &&
+ S_ISREG(st.st_mode))
{
if (exten.compare("*") == 0)
list.push_back(static_cast<std::string>(dirp->d_name));
struct ifreq¶
If struct ifreq causes problems (e. g. missing ifr_ifindex) consider using struct lifreq, see for example http://bugs.python.org/issue21287.
Too many arguments to function ‘getpwuid_r’, etc.¶
Compile with CPPFLAGS="-D_POSIX_C_SOURCE=199506L" or "-D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT"
Missing strverscmp()¶
Use libiberty-dev package: link with -liberty, include libiberty/libiberty.h. The only known package with such a problem is tree (actually it includes strverscmp.c).
Debian symbols file¶
glibc defines FILE as _IO_FILE, illumos libc - as __FILE.
So C++ functions differ, and dh_makeshlibs can fail:
dpkg-gensymbols: warning: some new symbols appeared in the symbols file: see diff output below dpkg-gensymbols: warning: some symbols or patterns disappeared in the symbols file: see diff output below dpkg-gensymbols: warning: debian/libqt5webkit5/DEBIAN/symbols doesn't match completely debian/libqt5webkit5.symbols ... dh_makeshlibs: failing due to earlier errors
Fix:
@@ -2182,7 +2182,8 @@ libQt5WebKit.so.5 libqt5webkit5 #MINVER# _ZN3JSC7JSProxy9setTargetERNS_2VMEPNS_14JSGlobalObjectE@Base 5.2.0 _ZN3JSC7JSScope13objectAtScopeEPS0_@Base 5.0.2 _ZN3JSC7JSValue13isValidCalleeEv@Base 5.0.2 - _ZN3JSC7Options14dumpAllOptionsEP8_IO_FILE@Base 5.0.2 + (arch=!illumos-amd64)_ZN3JSC7Options14dumpAllOptionsEP8_IO_FILE@Base 5.0.2 + (arch=illumos-amd64)_ZN3JSC7Options14dumpAllOptionsEP6__FILE@Base 5.2.1+dfsg-6~dyson1 _ZN3JSC7Options9s_optionsE@Base 5.0.2 _ZN3JSC7Options9setOptionEPKc@Base 5.0.2 _ZN3JSC7Profile10restoreAllEv@Base 5.0.2
Getting stack boundaries¶
On Linux we usually use pthread_getattr_np(), on Dyson we have thr_stksegment().
Be careful: if stack is "unlimited", ss_size will hold RLIM_INFINITY = -3 (see sys/resource.h) which definitely must not be interpreted as stack size! In this case lower stack boundary should be set to 0xFFFF800000000000L.
Example from Mono:
#elif (defined(__sun__) || defined(__illumos_kernel__))
#include <thread.h>
#include <errno.h>
{
int rc;
stack_t s;
do {
rc = thr_stksegment(&s);
} while (rc != 0 && errno == EAGAIN);
info->stack_end = s.ss_sp;
// Is stack "unlimited" ?
if (s.ss_size == RLIM_INFINITY)
{
// XXX Lower stack boundary
info->stack_start_limit = (void*)0xFFFF800000000000L;
}
else
{
info->stack_start_limit = (void*)((intptr_t)s.ss_sp - (intptr_t)s.ss_size);
}
}
#else
P. S. pthread_attr_get_np() is provided by libc since 5.10.18.git.2a44663-4 (2017-11-22).
Getting path of executable¶
Use const char * getexecname() from stdlib.h or
readlink("/proc/self/path/a.out", buf, bufsize);
http://stackoverflow.com/questions/933850/how-to-find-the-location-of-the-executable-in-c
Conflicting declarations of abs() in C++ sources¶
Synopsis:
In file included from ../../src/base/dict.h:40:0,
from freetype.cpp:152:
/usr/include/c++/4.8/cstdlib: In function ‘long long int std::abs(long long int)’:
/usr/include/c++/4.8/cstdlib:174:20: error: declaration of C function ‘long long int std::abs(long long int)’ conflicts with
abs(long long __x) { return __builtin_llabs (__x); }
^
In file included from /usr/include/stdlib.h:38:0,
from ../../include/Inventor/SoType.h:37,
from ../../include/Inventor/errors/SoError.h:39,
from ../../include/Inventor/errors/SoDebugError.h:36,
from ../../src/coindefs.h:95,
from freetype.cpp:44:
/usr/include/iso/stdlib_iso.h:122:12: error: previous declaration ‘int std::abs(int)’ here
extern int abs(int);
^
Make sure C++ sources include
cstdlib, not stdlib.h.
Missing IXDR_GET_LONG or similar *_LONG RPC macros¶
These macros are deprecated and removed from 64-bit Solaris or illumos. Glibc provides them via *_INT32 macros. Workaround:
#include <rpc/xdr.h> // ... #ifndef IXDR_GET_LONG #define IXDR_GET_LONG(buf) ((long)IXDR_GET_U_INT32(buf)) #endif #ifndef IXDR_PUT_LONG #define IXDR_PUT_LONG(buf, v) ((long)IXDR_PUT_INT32(buf, (long)(v))) #endif #ifndef IXDR_GET_U_LONG #define IXDR_GET_U_LONG(buf) ((u_long)IXDR_GET_LONG(buf)) #endif #ifndef IXDR_PUT_U_LONG #define IXDR_PUT_U_LONG(buf, v) IXDR_PUT_LONG(buf, (long)(v)) #endif
Boost threads unavailable on this platform¶
See /usr/include/boost/config/platform/solaris.hpp: -D_PTHREADS must be defined, use g++ -pthread