[Rcpp-devel] Rcpp_0.9.0.tar.gz does not build on FreeBSD

Rainer Hurling rhurlin at gwdg.de
Tue Jan 4 18:51:47 CET 2011


On 04.01.2011 16:58 (UTC+1), Dirk Eddelbuettel wrote:
> On 4 January 2011 at 07:04, Dirk Eddelbuettel wrote:
> | On 4 January 2011 at 12:02, Rainer Hurling wrote:
> | | On 03.01.2011 13:20 (UTC+1), Dirk Eddelbuettel wrote:
> | | As mentioned above build and install are successfull. But testing if
> | | installed package can be loaded fails:
> | |
> | | -------------------------------------------
> | | [..SNIP..]
> | | g++ -shared -L/usr/local/lib -o Rcpp.so Date.o DateVector.o Datetime.o
> | | DatetimeVector.o Dimension.o DottedPair.o Environment.o Evaluator.o
> | | Formula.o Function.o Language.o Module.o Pairlist.o Promise.o RObject.o
> | | RcppCommon.o Rcpp_init.o Reference.o S4.o Symbol.o WeakReference.o
> | | barrier.o cache.o coerce.o complex.o debugging.o exceptions.o posixt.o
> | | r_cast.o
> |
> | This line should have   -L/usr/lib64/R/lib -lR   at the end.
> |
> | Odd. Is your R version built as a shared library?
> |
> | | g++ -o libRcpp.so Date.o DateVector.o Datetime.o DatetimeVector.o
> | | Dimension.o DottedPair.o Environment.o Evaluator.o Formula.o Function.o
> | | Language.o Module.o Pairlist.o Promise.o RObject.o RcppCommon.o
> | | Rcpp_init.o Reference.o S4.o Symbol.o WeakReference.o barrier.o cache.o
> | | coerce.o complex.o debugging.o exceptions.o posixt.o r_cast.o -shared
> |
> | Dito here.
> |
> | | ar qc libRcpp.a Date.o DateVector.o Datetime.o DatetimeVector.o
> | | Dimension.o DottedPair.o Environment.o Evaluator.o Formula.o Function.o
> | | Language.o Module.o Pairlist.o Promise.o RObject.o RcppCommon.o
> | | Rcpp_init.o Reference.o S4.o Symbol.o WeakReference.o barrier.o cache.o
> | | coerce.o complex.o debugging.o exceptions.o posixt.o r_cast.o
> | | cp libRcpp.so ../inst/lib
> | | cp libRcpp.a ../inst/lib
> | | rm libRcpp.so libRcpp.a
> | | installiert nach /usr/local/lib/R/library/Rcpp/libs
> | | ** R
> | | ** inst
> | | ** preparing package for lazy loading
> | | ** help
> | | *** installing help indices
> | | ** building package indices ...
> | | ** testing if installed package can be loaded
> | | Error in dyn.load(file, DLLpath = DLLpath, ...) :
> | |    kann shared object '/usr/local/lib/R/library/Rcpp/libs/Rcpp.so' nicht
> | | laden:
> | |    /usr/local/lib/R/library/Rcpp/libs/Rcpp.so: Undefined symbol
> | | "backtrace_symbols"
> | | Fehler: loading failed
> | | * removing '/usr/local/lib/R/library/Rcpp'
> | | -------------------------------------------
> | |
> | | I do not understand why 'backtrace_symbols' is undefined. In
> | | 'src/debugging.cpp' all seems to be ok?
> |
> | No, it is a system library function we use. From 'man backtrace_symbol' :
> |
> | BACKTRACE(3)                      Linux Programmer's Manual                     BACKTRACE(3)
> |
> | NAME
> |        backtrace,  backtrace_symbols,  backtrace_symbols_fd  - support for application self-
> |        debugging
> |
> | SYNOPSIS
> |        #include<execinfo.h>
> |
> |        int backtrace(void **buffer, int size);
> |
> |        char **backtrace_symbols(void *const *buffer, int size);
> |
> |        void backtrace_symbols_fd(void *const *buffer, int size, int fd);
> | [...]
>
> A quick Google search for 'backtrace_symbols FreeBSD' points to a need for
> linking with -lexecinfo

libexecinfo is not an internal libc function within FreeBSD. It has to 
build as external so called port. On my system it is installed in 
version 1.1.

The ports info says:

-------------------------------------------
I. About
This is a quick-n-dirty BSD licensed clone of backtrace facility found
in the GNU libc, mainly intended for porting linuxish code to BSD
platforms, however it can be used at any platform which has a gcc
compiler.

More information about API can be found here:
http://www.gnu.org/software/libc/manual/html_node/Backtraces.html

II. Known limitations
- Depth of stack trace is limited to 128 levels, which should be enough
   in most cases, the limit can be increased by editing gen.py and
   regenerating stacktraverse.c. The reason for that limitation steams
   from the fact that __builtin_return_address() function takes only
   constant as an argument, while gcc(1) has problems compiling giant
   switch() tables. For example to compile one with 1024 entries gcc(1)
   needs more than 1GB of memory (sic!);
- executable have to be linked using `-Wl,--export-dynamic' option,
   in order for function names to be displayed properly.

III. Author
Author of this junk is Maxim Sobolev <sobomax at FreeBSD.org>. Any 
feedback, patches or suggestions are greatly appreciated.
-------------------------------------------


The library is located under /usr/local/lib/libexecinfo.[so|a]


The header file is located under /usr/local/include/execinfo.h

It defines 'backtrace_symbols' like this:

#ifndef _EXECINFO_H_
#define _EXECINFO_H_

#ifdef __cplusplus
extern "C" {
#endif

int     backtrace(void **, int);
char ** backtrace_symbols(void *const *, int);
void    backtrace_symbols_fd(void *const *, int, int);

#ifdef __cplusplus
}
#endif

#endif /* _EXECINFO_H_ */


> Can you please modify src/Makevars at your end by adding this line right
> after the line containing PKG_CPPFLAGS:
>
> PKG_LIB += -lexecinfo

Unfortunately this seems to be not enough. The same error occurs.

I think as a workaround we should disable the debugging function under 
FreeBSD. A suitable preprocessor define should be '__FreeBSD__'.

What do you think?

Rainer

>
> Dirk


More information about the Rcpp-devel mailing list