On 03/15/2016 12:30 PM, Aaron Taudt wrote:
I know they were not registered because BiocCheck told me so. In
addition, getDLLRegisteredRoutines('AneuFinder') returned an empty
data.frame.
But wrapping the R_init_<pkg> in an extern "C" block solved the problem:
extern "C" {
void R_init_AneuFinder(DllInfo *dll)
{
R_registerRoutines(dll, CEntries, NULL, NULL, NULL);
R_useDynamicSymbols(dll, FALSE);
// R_forceSymbols(dll, TRUE);
}
}
Thanks!
I am not sure what causes the nan_detected problem and I cannot
reproduce it ... Any advice?
This requires that the optimization flag be set to level 0, which can be
done by editing R.home("etc/Makeconf") to have a line like
CXXFLAGS = -O0
I *think* this reproduces across g++ and clang...
The problem is I think with the 'extern' keyword. With optimizations,
the pre-processor inlines the definition, so there is never a symbol
nan_detected. Without optimization the 'extern' keyword is taken
literally to mean that the symbol is defined elsewhere; since there is
no actual definition, it remains undefined. [probably playing a little
loose with what is actually going on...]. One solution is to provide an
actual (non-extern) definition, e.g., in a .cpp file. The high-scoring
answer here
http://stackoverflow.com/questions/11055802/static-and-extern-global-variables-in-c-and-c
might provide a starting point for more rigorous understanding / solution.
Martin
/Dipl. Biol. (t.o.) Aaron Taudt | PhD Student | University Medical
Center Groningen
European Research Institute for the Biology of Ageing (ERIBA)|
Quantitative Epigenetics
///
/A. Deusinglaan 1, gebouw 3226 | 9700 AD Groningen. |
//_www.ERIBA.umcg.nl_/
<https://mail.umcg.nl/owa/redir.aspx?SURL=MjFlzpaBN8LXiiXqvA10ICpS6i9DfAZ16RduD6U39IiuC_t5NUTTCGgAdAB0AHAAcwA6AC8ALwBtAGEAaQBsAC4AdQBtAGMAZwAuAG4AbAAvAG8AdwBhAC8AVQByAGwAQgBsAG8AYwBrAGUAZABFAHIAcgBvAHIALgBhAHMAcAB4AA..&URL=https%3a%2f%2fmail.umcg.nl%2fowa%2fUrlBlockedError.aspx>
2016-03-15 14:09 GMT+01:00 Martin Morgan <[email protected]
<mailto:[email protected]>>:
Hi Aaron --
On 03/15/2016 08:40 AM, Aaron Taudt wrote:
I am trying to register my native routines as recommended by
BiocCheck. I
followed the instructions in "Writing R Extensions" and have
implemented
the following code in "init.cpp". However, the routines are
still not
registered.
#include <Rinternals.h>
#include <R_ext/Rdynload.h>
#include "R_interface.h" // contains univariate_hmm,
multivariate_hmm, etc.
static const R_CMethodDef CEntries[] = {
{"univariate_hmm", (DL_FUNC) &univariate_hmm, 24,
(R_NativePrimitiveArgType[24]) {INTSXP, INTSXP, INTSXP, INTSXP,
REALSXP,
REALSXP, INTSXP, INTSXP, REALSXP, INTSXP, REALSXP, REALSXP, REALSXP,
REALSXP, INTSXP, REALSXP, REALSXP, REALSXP, REALSXP, LGLSXP, INTSXP,
INTSXP, INTSXP, INTSXP}},
{"multivariate_hmm", (DL_FUNC) &multivariate_hmm, 18,
(R_NativePrimitiveArgType[18]) {REALSXP, INTSXP, INTSXP, INTSXP,
INTSXP,
INTSXP, INTSXP, REALSXP, INTSXP, REALSXP, REALSXP, REALSXP, REALSXP,
REALSXP, LGLSXP, INTSXP, INTSXP, INTSXP}},
{"univariate_cleanup", (DL_FUNC) &univariate_cleanup, 0,
NULL},
{"multivariate_cleanup", (DL_FUNC) &multivariate_cleanup, 1,
(R_NativePrimitiveArgType[1]) {INTSXP}},
{NULL, NULL, 0, NULL}
};
void R_init_AneuFinder(DllInfo *dll)
{
R_registerRoutines(dll, CEntries, NULL, NULL, NULL);
R_useDynamicSymbols(dll, FALSE);
}
My NAMESPACE contains
useDynLib(AneuFinder, .registration = TRUE)
I don't see what's missing here, because the routines are still not
registered. I appreciate any help.
How do you know that they are not registered?
This is C code, but init.cpp is compiled by the C++ compiler; do you
need extern "C" {} around the this code?
When I try to install the most recent version of your package on the
tracker, my default setting has compiler option -O0 (in
R.home("etc/Makeconf")) and the nan_expected symbol is missing from
the shared object
** testing if installed package can be loaded
Bioconductor version 3.3 (BiocInstaller 1.21.3), ?biocLite for help
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object
'/home/mtmorgan/R/x86_64-pc-linux-gnu-library/3.3/AneuFinder/libs/AneuFinder.so':
/home/mtmorgan/R/x86_64-pc-linux-gnu-library/3.3/AneuFinder/libs/AneuFinder.so:
undefined symbol: nan_detected
Error: loading failed
Execution halted
ERROR: loading failed
Martin
[[alternative HTML version deleted]]
_______________________________________________
[email protected] <mailto:[email protected]>
mailing list
https://stat.ethz.ch/mailman/listinfo/bioc-devel
This email message may contain legally privileged and/or
confidential information. If you are not the intended recipient(s),
or the employee or agent responsible for the delivery of this
message to the intended recipient(s), you are hereby notified that
any disclosure, copying, distribution, or use of this email message
is prohibited. If you have received this message in error, please
notify the sender immediately by e-mail and delete this email
message from your computer. Thank you.
This email message may contain legally privileged and/or confidential
information. If you are not the intended recipient(s), or the employee or
agent responsible for the delivery of this message to the intended
recipient(s), you are hereby notified that any disclosure, copying,
distribution, or use of this email message is prohibited. If you have received
this message in error, please notify the sender immediately by e-mail and
delete this email message from your computer. Thank you.
_______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/bioc-devel