2016-04-28 17 views
1

Ich würde etwas Hilfe beim Erstellen eines Rcpp-Pakets benötigen, das mit der NLopt-Bibliothek verknüpft (http://ab-initio.mit.edu/wiki/index.php/NLopt).Rcpp Verknüpfung zu externer Bibliothek (NLopt)

Ich bin auf Windows und mit RStudio 'Build & Reload'.

Ich habe die folgenden Dateien in \ src-Ordner des Pakets:

  • \ src
    • Makevars.in
    • Makevars.win
    • RcppExports.cpp
    • nlopt .h
    • nlopt.hpp
    • libnlopt.lib
    • libnlopt.def
    • libnlopt.a
    • libnlopt.dll

, wo ich die LIB kopiert haben (gebaut mit MinGW) und DLL-Dateien von NLOpt zu der \ src-Ordner in der Hoffnung, dass R sie selbst kompilieren würde. Das scheint jedoch nicht der Fall zu sein. Aus diesem Grund habe ich eine Makevars-Datei hinzugefügt, in der ich versuche, eine Verknüpfung zur Bibliothek herzustellen.

Wenn von RStudio ausgeführt wird, erhalte ich die folgende Fehlermeldung, die, nehme ich an, mir sagt, dass es ein Problem mit Verknüpfung (siehe „undefined reference“) an die NLOP Bibliothek:

Installation zu Bibliothek 'C: /Users/g49128/Documents/R/win-library/3.2'

Installation Quelle Paket 'NewPackage' ... ** libs

g ++ -m64 -shared -s - static-libgcc -o NewPackage.dll tmp.def RcppExports .o Rcpp_project_test.o -Lc: /Temp/R/Rcpp/NeuPackage/src/libnlopt.a -Lc:/applications/extsoft/lib/x64 -Lc:/applications/extsoft/lib -LC:/PROGRA ~ 1/R/R-32 ~ 1.2/bin/x64 -lR Rcpp_project_test.o: Rcpp_project_test.cpp :(text + 0x73c.): undefined reference to `__imp_nlopt_create '

So vermute ich, dass ich haven' Ich habe die Makevars richtig verstanden, nicht so versiert in denen.

Aus mehreren CRAN Pakete Beratung, insbesondere nloptr, meine aktuelle beste Vermutung auf den Inhalt beider makevars Dateien ist:

NLOPT_HOME = c:/Temp/R/RCPP/NewPackage/src.

KG_CFLAGS = -I "$ (NLOPT_HOME)"

PKG_LIBS = -L "$ (NLOPT_HOME) /libnlopt.a"

wo 'libnlopt.a' ist die Bibliothek und die Umwelt Die Variable 'NLOPT_HOME' enthält den Pfad zur Bibliothek.

Kann mir jemand sagen, was ich hier vermisse? Jede Hilfe würde sehr geschätzt werden, danke.

+0

Ich denke, Sie invertiert '-l' und' -L' in Makevars ('-L' ist für Verzeichnisse '-l' ist für lib-Dateien) – purplepsycho

+0

danke für die Eingabe, invertieren -l und -L (auch da weder -l noch -L vor dem lib-Pfad sind, scheint das nicht der Fall zu sein; In diesem Fall beschwert sich der Compiler, dass er -lc: /Temp/R/Rcpp/NewPackage/src/libnlopt.a nicht finden kann. –

Antwort

3

Das nloptr Paket selbst macht das zuverlässig. Es verwendet die folgende Makevars.win:

# Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. 
# This code is published under the L-GPL. 
# 
# File: Makevars.win 
# Author: Jelmer Ypma 
# Date: 18 August 2010 
# 
# 09 June 2011: Windows support added thanks to Stefan Theussl and Uwe Ligges. 
#    NLOPT_HOME is the directory where a working installation of 
#    NLopt is located (within subdirectories NLOPT_VERSION/R_ARCH) 
# 18 November 2011: Removed NLOPT_VERSION macro and adopted some other changes 
#     proposed by Brian Ripley to make nloptr work with his new toolchain. 
#     NLopt should now be located in NLOPT_HOME/R_ARCH (i.e. without 
#     version number) 
# 19 February 2013: NLopt is compiled with --with-cxx option, in order to include 
#     the StoGo algorithm. This means that we now need to link to 
#     with -lnlopt_cxx and also link to the c++ library, -lstdc++. 
# 7 November 2013: Changed PKG_CPPFLAGS to PKG_CFLAGS. 
# 2 May 2014: Added quotes around include paths to allow for spaces in NLOPT_HOME. 

# C Compiler options 
PKG_CFLAGS = -I"$(NLOPT_HOME)$(R_ARCH)/include" 
PKG_LIBS = -L"$(NLOPT_HOME)$(R_ARCH)/lib" -lnlopt_cxx 

Das setzt voraus, dass Sie die richtige NLOPT_HOME Variable gesetzt haben.

Sie können manchmal eine entsprechende vorgefertigte Bibliothek von einer CRAN-Support-Site herunterladen, aber ich sehe das hier nicht.

+0

Danke Dirk. Ich habe es jetzt mit der folgenden Makevars.win-Datei, die ich zuvor versucht habe, zu arbeiten. Ich weiß nicht, warum es plötzlich funktioniert, aber es ist großartig. PKG_CFLAGS = -l "$ (NLOPT_HOME)" PKG_LIBS = -L "$ (NLOPT_HOME)" -lnlopt –