【问题标题】:LDFLAGS not read in Makevars.win when building an Rcpp package构建 Rcpp 包时未在 Makevars.win 中读取 LDFLAGS
【发布时间】:2021-12-14 19:35:07
【问题描述】:

又短又甜:

我正在编写一个使用 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 标志)

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

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'的未定义引用`

我正在使用 rtools40-std=gnu++11 在 Windows 10 上进行编译

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

【问题讨论】:

    标签: c++ windows rcpp package-management


    【解决方案1】:

    那里发生了很多事情,我们需要分解。

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

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

    编辑:你可以看看我的(更复杂的)Makevars.win for RInside。我只是在这里拥有的所有存储库中进行了 grep'ed,并且我没有任何人在 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,如上所述。

    【讨论】:

    • 我已经看过很多你的答案,所以感谢你教给我的所有东西。我用PKG_LIBS 尝试了同样的hack 我得到了一个``` make: *** No rule to make target '-fstack-protector',需要...停止。 ``` 我已经查看了将它放到 bioconductor 上的 Makevars.win 包,但我还没有找到直接设置链接器标志的包。
    • 我的意思是:在您当前使用 PKG_LIBS 的地方使用 OBJECTS。句号。然后为PKG_LIBS 添加-fstack_protector(作为一个或多个)参数。他们不会成为目标。
    • 好的。谢谢你。我不知道为什么我认为您在摘要中使用OBJECTS。将OBJECTS 设置为自己的变量并将其用作SHLIB 的依赖项似乎是缺少的步骤。我没有收到编译器错误。一旦我有机会在 Windows 上验证代码,我会将答案标记为已接受。
    • @JosephO'Brien 那么验证是如何进行的呢?
    • @eddelbuettel 我应该在几周前更新它,但我们现在在 Windows 上具有该功能。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    相关资源
    最近更新 更多