Ошибка связи с Rtools mingw_64 и Eigen - PullRequest
0 голосов
/ 24 октября 2019

У нас есть библиотека C ++ (libEDM.a), которая интегрирует Eigen. Библиотека является автономным в качестве основного API, который оборачивается Rcpp и pybind11 для пользовательских интерфейсов.

Поскольку Eigen вызывается из библиотеки изнутри, мы не используем RcppEigen в оболочке Rcpp.

Это прекрасно работает на сборках пакетов linux и OSX R, а также на сборке mingw-32 (arch - i386) для R (с использованием devtools :: check_win_release).

Однако для сборки (arch - x64) с mingw-64 компоновщик не может найти собственные ссылки в C ++ libEDM.a, vis (из winbuilder):

d:/Compiler/gcc-4.9.3/mingw_64/bin/g++ -m64 -shared -s -static-libgcc -o rEDMNew.dll tmp.def CCM.o ComputeError.o DataFrame.o Embed.o EmbedDim.o Multiview.o PredictInterval.o PredictNL.o RcppEDMCommon.o RcppExports.o SMap.o Simplex.o -L./cppEDM/src/ -lEDM -Ld:/Compiler/gcc-4.9.3/local330/lib/x64 -Ld:/Compiler/gcc-4.9.3/local330/lib -LD:/RCompile/recent/R-3.6.1/bin/x64 -lR

./cppEDM/src//libEDM.a(SMap.o):SMap.cc:(.text+0x245d): undefined reference to `Eigen::internal::first_aligned_impl<16, Eigen::CwiseUnaryOp<Eigen::internal::scalar_abs2_op<double>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1>, -1, 1, true>, -1, 1, false> const, -1, 1, false> const>, true>::run(Eigen::CwiseUnaryOp<Eigen::internal::scalar_abs2_op<double>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1>, -1, 1, true>, -1, 1, false> const, -1, 1, false> const> const&)'

Недостатком для mingw-64 является добавление флага -Wa,-mbig-obj, передаваемого компоновщику, так как кажется, что Eigen-шаблоны с mingw-64 превышают количество разрешенных секций.

Возможно, это проблема с компоновщиком / опцией mingw-64, так как кажется, что mingw-32 и другие сборки работают нормально?


Обновление : Кажетсячто конфигурация линкера и Eigen застряли в каком-то рекурсивном поиске. Использование Rtools35 в Windows 10 с R 3.4.3 и следующий Makevars.win:

PKG_CPPFLAGS = -I./cppEDM/src -I../
PKG_LIBS     = -L./cppEDM/src/ -lEDM
CXX_STD      = CXX11

$(SHLIB): cppEDM/src/libEDM.a

cppEDM/src/libEDM.a:
    @(cd cppEDM/src && $(MAKE) -f makefile.mingw \
          CC="$(CC)" CFLAGS="-Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../ $(CPICFLAGS)" AR="$(AR)" RANLIB="$(RANLIB)")

Сборка состоит из двух этапов. Сначала код интерфейса Rcpp компилируется каноническим Makefile, затем libEDM.a встраивается в cppEDM / src, который затем связывается с объектами Rcpp для конечной библиотеки.

Сборка i386 выглядит нормально, создает и устанавливает rEDMNew.dll, как указано ниже. Сборка x64, кажется, собирается без инцидентов, и затем требуется около 20 минут для создания rEDMNew.dll в каталоге src/-x64/. Тем не менее, он, кажется, застопорился, процессор работает ~ 50% в течение нескольких часов ... и rEDMNew.dll не установлен.

Есть идеи? Возможно, флаг компоновщика?

Я предполагаю, что сбой сборки x64 является дисквалификацией CRAN. Это последнее препятствие, но оно кажется большим.

C:.\EDM\rEDM_cpp_dev>R CMD INSTALL rEDMNew

In R CMD INSTALL
* installing to library './R/win-library/3.4'
* installing *source* package 'rEDMNew' ...
** libs

*** arch - i386

c:/Rtools/mingw_32/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c CCM.cpp -o CCM.o
c:/Rtools/mingw_32/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c ComputeError.cpp -o ComputeError.o
c:/Rtools/mingw_32/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c DataFrame.cpp -o DataFrame.o
c:/Rtools/mingw_32/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c Embed.cpp -o Embed.o
c:/Rtools/mingw_32/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c EmbedDim.cpp -o EmbedDim.o
c:/Rtools/mingw_32/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c Multiview.cpp -o Multiview.o
c:/Rtools/mingw_32/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c PredictInterval.cpp -o PredictInterval.o
c:/Rtools/mingw_32/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c PredictNL.cpp -o PredictNL.o
c:/Rtools/mingw_32/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c RcppEDMCommon.cpp -o RcppEDMCommon.o
c:/Rtools/mingw_32/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c RcppExports.cpp -o RcppExports.o
c:/Rtools/mingw_32/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c SMap.cpp -o SMap.o
c:/Rtools/mingw_32/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c Simplex.cpp -o Simplex.o

make[1]: Entering directory './src-i386/cppEDM/src'

c:/Rtools/mingw_32/bin/gcc  -c Common.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_32/bin/gcc  -c AuxFunc.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_32/bin/gcc  -c DateTimeUtil.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_32/bin/gcc  -c Parameter.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_32/bin/gcc  -c Embed.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_32/bin/gcc  -c Interface.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_32/bin/gcc  -c Neighbors.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_32/bin/gcc  -c Simplex.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_32/bin/gcc  -c Eval.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_32/bin/gcc  -c CCM.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_32/bin/gcc  -c Multiview.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_32/bin/gcc  -c SMap.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_32/bin/ar -rcs libEDM.a Common.o AuxFunc.o DateTimeUtil.o Parameter.o Embed.o Interface.o Neighbors.o Simplex.o Eval.o CCM.o Multiview.o SMap.o
cp libEDM.a ../lib/

make[1]: Leaving directory './src-i386/cppEDM/src'

c:/Rtools/mingw_32/bin/g++ -shared -s -static-libgcc -o rEDMNew.dll tmp.def CCM.o ComputeError.o DataFrame.o Embed.o EmbedDim.o Multiview.o PredictInterval.o Pred
ictNL.o RcppEDMCommon.o RcppExports.o SMap.o Simplex.o -L./cppEDM/src/ -lEDM -LC:/PROGRA~1/R/R-34~1.4/bin/i386 -lR

installing to ./R/win-library/3.4/rEDMNew/libs/i386


*** arch - x64

c:/Rtools/mingw_64/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c CCM.cpp -o CCM.o
c:/Rtools/mingw_64/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c ComputeError.cpp -o ComputeError.o
c:/Rtools/mingw_64/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c DataFrame.cpp -o DataFrame.o
c:/Rtools/mingw_64/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c Embed.cpp -o Embed.o
c:/Rtools/mingw_64/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c EmbedDim.cpp -o EmbedDim.o
c:/Rtools/mingw_64/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c Multiview.cpp -o Multiview.o
c:/Rtools/mingw_64/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c PredictInterval.cpp -o PredictInterval.o
c:/Rtools/mingw_64/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c PredictNL.cpp -o PredictNL.o
c:/Rtools/mingw_64/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c RcppEDMCommon.cpp -o RcppEDMCommon.o
c:/Rtools/mingw_64/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c RcppExports.cpp -o RcppExports.o
c:/Rtools/mingw_64/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c SMap.cpp -o SMap.o
c:/Rtools/mingw_64/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-34~1.4/include" -DNDEBUG -I./cppEDM/src -I../ -I"./R/win-library/3.4/Rcpp/include"        -O2 -Wall  -mtune=generic -c Simplex.cpp -o Simplex.o

make[1]: Entering directory './src-x64/cppEDM/src'

c:/Rtools/mingw_64/bin/gcc  -c Common.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_64/bin/gcc  -c AuxFunc.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_64/bin/gcc  -c DateTimeUtil.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_64/bin/gcc  -c Parameter.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_64/bin/gcc  -c Embed.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_64/bin/gcc  -c Interface.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_64/bin/gcc  -c Neighbors.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_64/bin/gcc  -c Simplex.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_64/bin/gcc  -c Eval.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_64/bin/gcc  -c CCM.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_64/bin/gcc  -c Multiview.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_64/bin/gcc  -c SMap.cc -Wa,-mbig-obj -std=c++11 -DCCM_THREADED -DMULTIVIEW_VALUES_OVERLOAD -I../
c:/Rtools/mingw_64/bin/ar -rcs libEDM.a Common.o AuxFunc.o DateTimeUtil.o Parameter.o Embed.o Interface.o Neighbors.o Simplex.o Eval.o CCM.o Multiview.o SMap.o
cp libEDM.a ../lib/

make[1]: Leaving directory './src-x64/cppEDM/src'

c:/Rtools/mingw_64/bin/g++ -shared -s -static-libgcc -o rEDMNew.dll tmp.def CCM.o ComputeError.o DataFrame.o Embed.o EmbedDim.o Multiview.o PredictInterval.o Pred
ictNL.o RcppEDMCommon.o RcppExports.o SMap.o Simplex.o -L./cppEDM/src/ -lEDM -LC:/PROGRA~1/R/R-34~1.4/bin/x64 -lR

- Это то, где оно просто исчезает ...

Извинения, если я нарушил социальную нормуредактировать этот пост. Похоже, что это логично, а не начинать новый.

...