[Rcpp-devel] Error linking: Undefined reference to...
Dirk Eddelbuettel
edd at debian.org
Thu Sep 8 15:49:11 CEST 2011
On 8 September 2011 at 15:11, Bjørn Skogtrø wrote:
| Hi Dirk,
|
| Thanks for the response - it was helpful.
Glad to hear that!
| I've added the library you suggested and the appropriate path, and now linking
| is fine. For completeness, my makevars.win now looks like this:
|
| ## Use the R_HOME indirection to support installations of multiple R version
| ## PKG_LIBS = $(shell "${R_HOME}/bin${R_ARCH_BIN}/Rscript.exe" -e
| "Rcpp:::LdFlags()")
|
| PKG_LIBS = $("C:/PROGRA~1/R/R-2.13.1/library/Rcpp/lib/i386/libR.cpp.a")
| PKG_LIBS+= -lRcpp
| PKG_LIBS+= -LC:/PROGRA~1/R/R-213~1.1/library/Rcpp/libs/i386
Isn't the first line a null op? What is it supposed to do? Just the latter
two are probably fine as well.
Dirk
| Guess the approach can be prettified using the $(shell....) approach above and
| regular expressions, but I'm no expert on this.
|
| Thanks again!
|
| BR,
| Bjørn
|
|
|
|
| 2011/9/8 Dirk Eddelbuettel <edd at debian.org>
|
|
| Hi Bjørn,
|
| Welcome!
|
| On 8 September 2011 at 10:36, Bjørn Skogtrø wrote:
| | Hi guys.
| |
| | First off, thanks for a nice piece of software.
| |
| | Now to the issue at hand:
| |
| | I'm trying to compile and link the package obtained using
| Rcpp.package.skeleton
| | (...) (out of the box). I'm running R 2.13.1, with Rcpp 0.9.6 on a
| Windows XP
| | machine.
| |
| | The first problem I ran into was how the package-libs variable PKG_LIBS
| was
| | pasted into the g++ string for compiling:
| |
| | g++ -shared -s -static-libgcc -o processes.dll tmp.def rcpp_hello_world.o
| | rcpp_module.o C:/Program Files/R/R-2.13.1/library/Rcpp/lib/i386/libRcpp.a
| -LC:/
| | PROGRA~1/R/R-213~1.1/bin/i386 -lR
| | g++.exe: C:/Program: No such file or directory
| | g++.exe: Files/R/R-2.13.1/library/Rcpp/lib/i386/libRcpp.a: No such file
| or
| | directory
| | ERROR: compilation failed for package 'processes'
| | * removing 'D:/Documents/Eclipse/processes.Rcheck/processes'
| |
| | As you can see, paths with spaces in them is not cool.
|
| Correct. The shell / Makefile quoting gets in the way.
|
| If someone comes with _reliable ways to improve this_ we'd be open for
| patches. Until then the recommendation is to not use directories with
| spaces.
|
| | I resolved this by overriding it in makevars.win by hard-coding it, so my
| makevars.win looks like
|
| Good idea.
|
| | ## Use the R_HOME indirection to support installations of multiple R
| version
| | ## PKG_LIBS = $(shell "${R_HOME}/bin${R_ARCH_BIN}/Rscript.exe" -e
| | "Rcpp:::LdFlags()")
| | PKG_LIBS = $("C:/PROGRA~1/R/R-2.13.1/library/Rcpp/lib/i386/libRcpp.a")
| |
| | Compiling then works fine, and spits out the files rcpp_module.o and
| | rcpp_hello_world.o. The problem then is linking, which complains over
| | "undefined reference":
| |
| | * installing *source* package 'processes' ...
| | ** libs
| | cygwin warning:
| | MS-DOS style path detected: C:/PROGRA~1/R/R-213~1.1/etc/i386/Makeconf
| | Preferred POSIX equivalent is: /cygdrive/c/PROGRA~1/R/R-213~1.1/etc/
| i386/
| | Makeconf
| | CYGWIN environment variable option "nodosfilewarning" turns off this
| | warning.
| | Consult the user's guide for more details about POSIX paths:
| | http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
| | g++ -shared -s -static-libgcc -o processes.dll tmp.def rcpp_hello_world.o
| | rcpp_module.o -LC:/PROGRA~1/R/R-213~1.1/bin/i386 -lR
| | rcpp_hello_world.o:rcpp_hello_world.cpp:(.text+0x66): undefined reference
| to
| | `Rcpp::RObject::setSEXP(SEXPREC*)'
| | rcpp_hello_world.o:rcpp_hello_world.cpp:(.text+0x71): undefined reference
| to
| | `void Rcpp::internal::r_init_vector<16>(SEXPREC*)'
| | rcpp_hello_world.o:rcpp_hello_world.cpp:(.text+0x148): undefined
| reference to
| | `Rcpp::RObject::setSEXP(SEXPREC*)'
| | rcpp_hello_world.o:rcpp_hello_world.cpp:(.text+0x1a7): undefined
| reference to
| | `Rcpp::RObject::setSEXP(SEXPREC*)'
| |
| | I'm assuming that these two errors are somewhat related, but can't figure
| it
| | out (the compile processs running R CMD check is a bit intransparent to
| me). I
| | should mention that this exact procedure worked fine until I upgraded
| from
| | 2.13.0 to 2.13.1 yesterday.
| |
| | Any clues on what to look at??
|
| Your PKG_LIBS appears to be wrong:
|
| g++ -shared -s -static-libgcc -o processes.dll tmp.def
| rcpp_hello_world.o
| rcpp_module.o -LC:/PROGRA~1/R/R-213~1.1/bin/i386 -lR
|
| You need a -L part for a location, as well as -l part giving a library, eg
|
| g++ -shared -s -static-libgcc -o processes.dll tmp.def
| rcpp_hello_world.o
| rcpp_module.o -LC:/PROGRA~1/R/R-213~1.1/bin/i386 -lRcpp -lR
|
| where I added -lRcpp.
|
| Hope this helps, Dirk
|
| | Thanks!
| |
| | BR,
| | Bjørn
| |
| |
| | --
| | Up, down, turn around
| | Please dont let me hit the ground
| | Tonight I think Ill walk alone
| | Ill find my soul as I go home.
| |
| | ----------------------------------------------------------------------
| | _______________________________________________
| | Rcpp-devel mailing list
| | Rcpp-devel at lists.r-forge.r-project.org
| | https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
| --
| Two new Rcpp master classes for R and C++ integration scheduled for
| New York (Sep 24) and San Francisco (Oct 8), more details are at
| http://dirk.eddelbuettel.com/blog/2011/08/04#
| rcpp_classes_2011-09_and_2011-10
| http://www.revolutionanalytics.com/products/training/public/
| rcpp-master-class.php
|
|
|
|
| --
| Up, down, turn around
| Please dont let me hit the ground
| Tonight I think Ill walk alone
| Ill find my soul as I go home.
--
Two new Rcpp master classes for R and C++ integration scheduled for
New York (Sep 24) and San Francisco (Oct 8), more details are at
http://dirk.eddelbuettel.com/blog/2011/08/04#rcpp_classes_2011-09_and_2011-10
http://www.revolutionanalytics.com/products/training/public/rcpp-master-class.php
More information about the Rcpp-devel
mailing list