Accessing 3rd-Party Libraries

knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
knitr::knit_engines$set(callme = callme:::callme_engine)
library(callme)

```{css, echo=FALSE} .callme { background-color: #E3F2FD; } pre.callme span { background-color: #E3F2FD; }

## Introduction

When linking to a third party library it will often be necessary to explicitly 
specify a number of things:

* `#include` the header file in the C code
* Use `PKG_CPPFLAGS` to nominate the search path for where the header file
  may be found (`-I` flag)
* Use `PKG_LIBS` to specify
    * Additional search paths for libraries (`-L` flag)
    * which libraries to link to (`-l` flag)

## Example: Linking to `zlib`


```{callme}
#| PKG_LIBS = "-lz"
#include <R.h>
#include <Rinternals.h>
#include "zlib.h"

SEXP get_zlib_version(void) {
  // const char * ZEXPORT zlibVersion(void);
  return mkString(zlibVersion());
}
# Compile the code with explicit link to library
compile(code, PKG_LIBS = "-lz")
# Call the function
get_zlib_version()

Possible variations

# include a search path for the library
compile(code, PKG_LIBS = "-L/local/libs -lz")

# Include a search path for the header
compile(code, PKG_LIBS = "-lz", PKG_CPPFLAGS = "-I/usr/local/include")

# Link to a drop-in replacement
compile(code, PKG_LIBS = "-lzlibng")

# Use "pkg-config" to automatically determine appropriate flags
compile(code, PKG_LIBS = "`pkg-config --libs zlib`", 
        PKG_CPPFLAGS = "`pkg-config --cflags zlib`")


Try the callme package in your browser

Any scripts or data that you put into this service are public.

callme documentation built on April 4, 2025, 2:37 a.m.