У нас есть библиотека 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
- Это то, где оно просто исчезает ...
Извинения, если я нарушил социальную нормуредактировать этот пост. Похоже, что это логично, а не начинать новый.