构建 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
如上所述。
简短而甜美:
我正在编写一个使用 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
如上所述。