构建 Rcpp 包时未在 Makevars.win 中读取 LDFLAGS

LDFLAGS not read in Makevars.win when building an Rcpp package

简短而甜美:

我正在编写一个使用 zlib 和 sqlite 的 Rcpp 包。

在下面的 Makevars.win 文件中,我设置了编译器标志并尝试设置一些目标。

PKG_CPPFLAGS=-I. -I./lib/sqlite/ -fopenmp -march=native -g -O2 -msse2 -fstack-protector -mfpmath=sse\
             -DRSQLITE_USE_BUNDLED_SQLITE \
             -DSQLITE_ENABLE_RTREE \
             -DSQLITE_ENABLE_FTS3 \
             -DSQLITE_ENABLE_FTS3_PARENTHESIS \
             -DSQLITE_ENABLE_FTS5 \
             -DSQLITE_ENABLE_JSON1 \
             -DSQLITE_ENABLE_STAT4 \
             -DSQLITE_SOUNDEX \
             -DRCPP_DEFAULT_INCLUDE_CALL=false \
             -DRCPP_USING_UTF8_ERROR_STRING \
             -DBOOST_NO_AUTO_PTR \
             -DSQLITE_MAX_LENGTH=2147483647 \
             -DHAVE_USLEEP=1

PKG_CXXFLAGS=$(CXX_VISIBILITY)
PKG_CFLAGS=$(C_VISIBILITY)

LDFLAGS=-fstack-protector

PKG_LIBS = lib/sqlite/sqlite3.o lib/zlib/adler32.o lib/zlib/compress.o lib/zlib/crc32.o lib/zlib/deflate.o lib/zlib/gzclose.o lib/zlib/gzlib.o lib/zlib/gzread.o lib/zlib/gzwrite.o lib/zlib/infback.o lib/zlib/inffast.o lib/zlib/inflate.o lib/zlib/inftrees.o lib/zlib/trees.o lib/zlib/uncompr.o lib/zlib/zutil.o  #-Llib/sqlite/ -lsqlite3

.PHONY: all

all: $(SHLIB)

$(SHLIB): $(PKG_LIBS)

(强调 -fstack-protector 标志)

尽管如此,构建 window 中的链接器行是:

C:/rtools40/mingw64/bin/g++ -std=gnu++11 -shared -s -static-libgcc -o OptiLCMSmzDB.dll tmp.def RcppExports.o base64.o mzDBReader.o mzDBWriter.o mzMLReader.o query_mzDB.o spectrum.o lib/sqlite/sqlite3.o lib/zlib/adler32.o lib/zlib/compress.o lib/zlib/crc32.o lib/zlib/deflate.o lib/zlib/gzclose.o lib/zlib/gzlib.o lib/zlib/gzread.o lib/zlib/gzwrite.o lib/zlib/infback.o lib/zlib/inffast.o lib/zlib/inflate.o lib/zlib/inftrees.o lib/zlib/trees.o lib/zlib/uncompr.o lib/zlib/zutil.o -LC:/PROGRA~1/R/R-40~1.4/bin/x64 -lR

有点长,但请注意我们最喜欢的旗帜不见了。结果,链接器让我面对以下数百个实例:

对“__stack_chk_fail”的未定义引用

我正在 windows 10 上使用 rtools40-std=gnu++11

进行编译

如果有任何建议,我将不胜感激。

我们需要分解的东西很多。

首先,您设法让 SHLIB 使用了目标文件的枚举列表。好的!我最近不得不这样做,我使用了 OBJECTS 列表。我认为如果您将 -fstack-protector 粘贴到 PKG_LIBS 中,您 可能 会很幸运,因为 PKG_* 变量在那里供您扩展默认值使用(在隐藏的 Makefile 由 R 控制)。而... LDFLAGS 可能会被忽略。

否则,我会建议在 4000 多个带有编译代码的 CRAN 包中进行采样。有些人会设置类似的东西,在 GitHub 处使用 'CRAN' “org” 进行搜索很粗糙,但总比 nuttin' 好。祝你好运!

编辑: 你可以看看我的(更复杂的)Makevars.win for RInside。我只是在我这里的所有回购协议中搜索了一下,我没有任何人在 Windows.

上设置 -fSOMETHING 的当前示例

编辑 2: 实际上,我确实有一个更好的例子供您参考。 每个 RcppArmadillo 包都使用

PKG_CXXFLAGS = -I../inst/include -I. $(SHLIB_OPENMP_CXXFLAGS) 
PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)

其中(R 系统级变量)SHLIB_OPENMP_CXXFLAGS 扩展为 -fopenmp。所以我真的认为你想要 PKG_LIBS 如上所述。