Hello everyone,
I am attempting to link to a C library named libxlsxwriter 
(http://libxlsxwriter.github.io/) that creates and styles XLSX files, but after 
several days of repeatedly reading "Writing R Extensions", and I am stuck and 
hoping someone can help me.
The C library is easy to use and works with C++ as you would expect.
For example, here is test.cpp:
#include <xlsxwriter.h>
int main() {
  lxw_workbook  *workbook  = workbook_new("myexcel.xlsx");
  lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL);
  int row = 0;
  int col = 0;
  worksheet_write_string(worksheet, row, col, "Hello me!", NULL);
  return workbook_close(workbook);
}
To compile this I need to run the makefile in the libxlsxwriter folder, which 
compiles the libxlsxwriter library, and then call:
cc test.cpp -o test -Ipath.to.xlsxwriter.h path.to.libxlsxwriter.a -lz
This generates an executable that creates an excel document. I understand this 
command says to compile test.cpp and specifies where to search for headers, and 
what libraries to link to so to get this to work with R all I should need to do 
is make the library, point to the header, and link to the .a file.
To get this to work with R, I created a libxlsxwriter folder in my /src folder 
with the libxlsxwriter library in it, and added this makevars to my /src:
PKG_CFLAGS=
# specify header location
PKG_CPPFLAGS=-Ilibxlsxwriter/include
# specify libs to link to
PKG_LIBS=liblsxwriter/lib/libxlsxwriter.a -lz
# make libxlsxwriter
libxlsxwriter/lib/libxlsxwriter.a:
            cd libxlsxwriter;$(MAKE)

When I build the package I can see that this runs the makevars, and generates 
the .a and .dll files in libxlsxwriter. I get no errors associated with headers 
or the libraries so I thought I would be good to go, but I can't seem to get 
anything to run.
Here is my test.cpp code I am trying to run in R with Rcpp:
#include <Rcpp.h>
#include <xlsxwriter.h>
using namespace Rcpp;
//' @useDynLib libxlsxwriter
//' @export
//' @import Rcpp
// [[Rcpp::export]]
void test() {
  lxw_workbook  *workbook  = workbook_new("myexcel.xlsx");
  lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL);
  int row = 0;
  int col = 0;
  worksheet_write_string(worksheet, row, col, "Hello me!", NULL);
  workbook_close(workbook);
}
I am fairly certain I am doing something wrong with my makevars that is 
preventing test.cpp from being compiled. I tried running the makevars for 
libxlsxwriter from the command line and then building using just this makevars:
PKG_CFLAGS=
# specify header location
PKG_CPPFLAGS=-Ilibxlsxwriter/include
# specify libs to link to
PKG_LIBS=liblsxwriter/lib/libxlsxwriter.a -lz
I see the .o files for test.cpp being built, which is a good sign, and 
indicates there was a problem with my previous makevars, but I get errors 
saying undefined reference for all the functions from libxlsxwriter, so clearly 
thinks aren't linking like I need them to. I am out of ideas at this point, so 
any guidance would be greatly appreciated.
A github repo with my code is here: https://github.com/carlganz/lwritexlsx
I was using this webpage as a guide for how to include a C library in an R 
package: http://mazamascience.com/WorkingWithData/?p=1151
Kind Regards,
Carl Ganz

        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to