c++ - 尝试使用外部库时 undefined reference

标签 c++ c r makefile rcpp

我正在尝试将 C 库合并到一些 Rcpp 代码中。

我可以轻松地在 C++ 程序中使用 C 库。我“制作”了 C 库,它在/lib 文件夹中创建了 .a 和 .dll 文件。然后我可以通过在程序中包含 header 并从命令行运行如下内容来使用该包:

cc myfile.cpp -o myfile -Ipath.to.header path.to.lib.a -lz

这基本上告诉编译器采用 .cpp 程序,包括来自 -I 的 header ,并链接到两个库。

如果我正确理解 makevars(不幸的是我似乎没有理解),那么让它与 Rcpp 一起工作应该不会太困难。

我将库添加到包中的一个文件夹中,并在 src 中添加一个 makevars 和 makevars.win,如下所示:

PKG_CFLAGS=
# specify header location
PKG_CPPFLAGS=-Ipath.to.lib/include
# specify libs to link to
PKG_LIBS=path.to.lib/lib/file.a -lz
# make library
path.to.lib/lib/file.a:
            cd path.to.lib;$(MAKE)

这正确地“制作”了库的 .a 和 .dll 文件,但是没有任何 Rcpp 魔术运行(即在构建中我从未看到编译文件的 g++ 系统调用src),所以“没有创建 Dll”。

我相当确定这是我创建库的 makevars 目标中的一个问题。当我从 makevars 中删除该部分,并在构建包之前自己从命令行“制作”库时,我使用 -I 和 -l 语句获得了正确的 g++ 调用,但我得到关于 undefined reference 的错误。

我注意到 -l 语句仅包含在生成最终 .dll 的最终 g++ 调用中,但未包含在较早的 g++ 调用中编译带有库头的文件的位置。

所以我有两个问题:

  • 我如何修复我的 makevars,使其“生成”库,但不阻止 Rcpp 编译 src 中的文件?

  • 如何处理 undefined reference ?该库显然不是仅包含 header 的,因此我猜测它需要在较早的 g++ 调用中使用 -l 语句,但这甚至可能是不可能的。

最佳答案

最好的方法是完全避免复杂的src/Makevars 文件。

解决此问题的一种简单方法:使用 configure 构建您的静态库,然后一旦您实际构建,只需在 src/Makevars 中引用它即可。

我在 Rblpapi(我们在其中复制外部提供的库)和 nloptr 中使用该方案,我们在其中下载 nlopt 源代码并“在需要时”构建它(即当系统上没有 libnlopt 时)。

关于c++ - 尝试使用外部库时 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38535274/

相关文章:

r - 图* 双列 knitr/Sweave 文档中的环境

c++ - 解决方案不适用于两个日期之间的天数

c++ - 有哪些用于生成解析器的程序?

c++ - cpp Linux套接字编程错误与接受

c - 半字节半数转换器

Rcpp:将 SEXP 转换为 float / double

r - check.names 的 cbind 错误

c++ - OpenCV 3.4.1 获取自定义训练的线性 SVM HoG detectMultiScale 的原始形式

mysql - 为什么我收到错误 malloc() : invalid size (unsorted)?

c - 将双指针传递给函数以在 C 中获取字符串