Включение Rcpp в проект Qt приводит к ошибке, влияющей на различные включенные библиотеки

Я делаю статическую библиотеку с Qt Creator, эта библиотека будет использоваться в более крупном приложении на основе графического интерфейса. Раньше я использовал Rcpp, но в качестве отправной точки я использовал R — так что, перемещая данные R в функции C ++, чтобы что-то делать и получать результат, я привык делать это с R studio. На этот раз я начинаю в проекте Qt, и мне нужна таблица для хранения некоторых данных, и Rcpp :: Dataframe прекрасно подойдет для работы, как и некоторые векторные классы. В моем исходном файле .cpp у меня есть оператор включения #include <Rcpp.h> и я посмотрел в Интернете и нашел пример использования библиотек Rcpp / RInside в Qt — хотя это больше касается RInside, чем Rcpp: Внутри и Qt

Кажется, что-то нужно добавить в файл .pro, чтобы заставить qmake делать правильные вещи. Я включил то, что, по моему мнению, необходимо для Rcpp, в свой файл .pro, прикрепленный ниже. Проблема, с которой я столкнулся, заключается в том, что до включения Rcpp в файл .pro и оператора include в файл .cpp, включение библиотек bpp, которые вы также можете увидеть в файле .pro ниже, не приводит к любые ошибки или предупреждения в компиляции. После включения операторов для включения R и Rcpp в файл .pro я получаю много предупреждений и одну ошибку, связанную с компонентом bpp, а именно: /local/yrq12edu/local/bpp/dev/include/Bpp/Numeric/NumConstants.h:96: error: expected unqualified-id before numeric constant, Есть также много Wunused-parameter сообщения, опять же, большинство из них, кажется, приходят из файлов внутри bpp. Это первый раз, когда мне приходилось иметь дело с чем-то вроде этого, и хотя я прочитал много документации по Qt, я все еще очень свежий новичок в Qt. Почему раньше я не получал ошибок, связанных с bpp, но получил их сейчас, когда я попытался включить Rcpp в мой проект Qt? И что я должен сделать, чтобы предпринять шаги, чтобы решить это?

#-------------------------------------------------
#
# Project created by QtCreator 2014-09-05T23:27:21
#
#-------------------------------------------------

QT       -= core gui

TARGET = libHybRIDS
TEMPLATE = lib
CONFIG += staticlib

SOURCES += hybridsengine.cpp
HEADERS += hybridsengine.h

INCLUDEPATH += /local/yrq12edu/local/bpp/dev/include
LIBS += -L/local/yrq12edu/local/bpp/dev/lib -lbpp-core
LIBS += -L/local/yrq12edu/local/bpp/dev/lib -lbpp-seq

# Set R home directory
R_HOME =                $$system(R RHOME)
# Set Rcpp include and lib flags.
RCPPINCL =              $$system($$R_HOME/bin/Rscript -e \'Rcpp:::CxxFlags\(\)\')
RCPPLIBS =              $$system($$R_HOME/bin/Rscript -e \'Rcpp:::LdFlags\(\)\')
# Set R cpp and ld flags. Also for BLAS and LAPACK it uses.
RCPPFLAGS =             $$system($$R_HOME/bin/R CMD config --cppflags)
RLDFLAGS =              $$system($$R_HOME/bin/R CMD config --ldflags)
RBLAS =                 $$system($$R_HOME/bin/R CMD config BLAS_LIBS)
RLAPACK =               $$system($$R_HOME/bin/R CMD config LAPACK_LIBS)

RCPPWARNING =           -Wno-unused-parameter

QMAKE_CXXFLAGS +=       $$RCPPWARNING $$RCPPFLAGS $$RCPPINCL
QMAKE_LFLAGS +=         $$RLDFLAGS $$RBLAS $$RLAPACK $$RCPPLIBSunix {
target.path = /usr/lib
INSTALLS += target
}

РЕДАКТИРОВАТЬ:
Следуя советам, я использовал пример файла pro в RInside / examples / qt в качестве отправной точки — следуя порядку операторов:

#-------------------------------------------------
#
# Project created by QtCreator 2014-09-05T23:27:21
#
#-------------------------------------------------

QT       -= core gui

TARGET = libHybRIDS
TEMPLATE = lib
CONFIG += staticlib

SOURCES += hybridsengine.cpp
HEADERS += hybridsengine.h

## comment this out if you need a different version of R,
## and set set R_HOME accordingly as an environment variable
R_HOME =        $$system(R RHOME)
#message("R_HOME is" $$R_HOME)

## include headers and libraries for R
RCPPFLAGS =         $$system($$R_HOME/bin/R CMD config --cppflags)
RLDFLAGS =      $$system($$R_HOME/bin/R CMD config --ldflags)
RBLAS =         $$system($$R_HOME/bin/R CMD config BLAS_LIBS)
RLAPACK =       $$system($$R_HOME/bin/R CMD config LAPACK_LIBS)

## if you need to set an rpath to R itself, also uncomment
RRPATH =        -Wl,-rpath,$$R_HOME/lib

## include headers and libraries for Rcpp interface classes
## note that RCPPLIBS will be empty with Rcpp (>= 0.11.0) and can be omitted
RCPPINCL =      $$system($$R_HOME/bin/Rscript -e \"Rcpp:::CxxFlags\(\)\")
RCPPLIBS =      $$system($$R_HOME/bin/Rscript -e \"Rcpp:::LdFlags\(\)\")

## for some reason when building with Qt we get this each time
##   /usr/local/lib/R/site-library/Rcpp/include/Rcpp/module/Module_generated_ctor_signature.h:25: warning: unused parameter ‘classname
## so we turn unused parameter warnings off
## no longer needed with Rcpp 0.9.3 or later
#RCPPWARNING =      -Wno-unused-parameter

## include headers and libraries for RInside embedding classes
RINSIDEINCL =       $$system($$R_HOME/bin/Rscript -e \"RInside:::CxxFlags\(\)\")
RINSIDELIBS =       $$system($$R_HOME/bin/Rscript -e \"RInside:::LdFlags\(\)\")

## compiler etc settings used in default make rules
QMAKE_CXXFLAGS +=   $$RCPPWARNING $$RCPPFLAGS $$RCPPINCL $$RINSIDEINCL
QMAKE_LIBS +=           $$RLDFLAGS $$RBLAS $$RLAPACK $$RINSIDELIBS $$RCPPLIBS

## addition clean targets
QMAKE_CLEAN +=      qtdensity Makefile

unix {
target.path = /usr/lib
INSTALLS += target
}

Помещение в мои операторы для включения библиотек bpp до или после операторов, относящихся к RInside и Rcpp, вызывает ту же ошибку, что и ранее.

Содержимое файла .h из bpp:

#ifndef _NUMCONSTANTS_H_
#define _NUMCONSTANTS_H_

#include <cmath>
#include <limits>

namespace bpp {

/**
* @brief this static class contains several useful constant values.
*
* This classe uses function in order to avoid the infamous "static initialization order fiasco".
* C++0x solves this...
*/
class NumConstants
{

public:
/**
* @name Golden ratio.
*
* The golden ratio, @f$\phi@f$ is equal to @f$\frac{1+\sqrt{5}}{2} = 1.6180339887498948482\ldots@f$.
* We also define @f$R=\phi-1@f$ and @f$C = 1 - R@f$.
* @{
*/
static double GOLDEN_RATIO_PHI() { return (1. + sqrt(5.)) / 2.; }
static double GOLDEN_RATIO_R() { return GOLDEN_RATIO_PHI() - 1.; }
static double GOLDEN_RATIO_C() { return 1. - GOLDEN_RATIO_R(); }

/** @} */

static double MEGA() { return 1e6; }
static double KILO() { return 1e3; }
static double DECI() { return 1e-1; }
static double CENTI() { return 1e-2; }
static double MILLI() { return 1e-3; }
static double MICRO() { return 1e-6; }
static double NANO() { return 1e-9; }
static double PICO() { return 1e-12; }

static double SMALL() { return 1e-6; }
static double TINY() { return 1e-12; }
static double VERY_TINY() { return 1e-20; }
static double VERY_BIG() { return static_cast<double>(1.7E+23); }

/**
* @name Define those constants in case they would not be available in stl/limits.
*
* @{
*/
static double INF() { return std::numeric_limits<double>::has_infinity ? -log(0) : std::numeric_limits<double>::max(); }
static double PINF() { return std::numeric_limits<double>::has_infinity ? -log(0) : std::numeric_limits<double>::max(); }
static double MINF() { return std::numeric_limits<double>::has_infinity ? log(0) : std::numeric_limits<double>::min(); }
static double NaN() { return NAN; }
/** @} */

static double PI() { return 3.141593; }
};

}//end of namespace bpp.

#endif  //_NUMCONSTANTS_H_

1

Решение

Вот предположение: в R_ext/Constants.h, у нас есть:

trunk/src/include/R_ext/Constants.h
28:#define M_PI 3.141592653589793238462643383279502884197169399375
32:#define PI             M_PI

Это макроопределение сталкивается с определением функции для PI, Таким образом, вы ожидаете, например,

#include <R.h> // pulls in 'R_ext/Constants.h'
#include "Bpp stuff" // definition for function named PI collides with macro

даст потенциальные ошибки. Определение макроса R для PI протекает в Bppи, следовательно, после того, как препроцессор сделан, эта строка:

static double PI() { return 3.141593; }

будет выглядеть

static double 3.141592653589793238462643383279502884197169399375() { return 3.141593; }

и компилятор может только сказать «Ват». Вот почему порядок включения может быть важным — в том числе Bpp Во-первых, можно избежать макро-загрязнения.

Похоже, что этого особого загрязнения можно избежать, определив #define STRICT_R_HEADERS (поскольку это то, что входит в запись).

0

Другие решения


По вопросам рекламы [email protected]