내가 하려고 이해하는 역할과의 관계를 매크로/변수를 설정에서~/.R/Makevars
과package_directory/src/Makevars
설치하는 경우/건축 자신의 R 패키지가 있습니다. 가정이 파일 보
~/.R/Makevars
CXX = g++
CXXSTD = -std=c++11
CXXFLAGS = -fsanitize=undefined,address -fno-omit-frame-pointer
CXX98 = g++
CXX98STD = -std=c++98
CXX11 = g++
CXX11STD = -std=c++11
CXX14 = g++
CXX14STD = -std=c++14
package_directory/src/Makevars
PKG_CPPFLAGS = -I../inst/include
CXX_STD = CXX11
나는 그것을 이해와 함께CXX
우리가 선택할 수 있는 컴파일러를 위한 C++때 R 패키지와 함께CXXSTD
우리가 선택한 기준과 함께CXXFLAGS
우리는 추가 컴파일러 플래그입니다. 으로PKG_CPPFLAGS
우리는 플래그를 추가한 C++선처리기와 함께CXX_STD
우리는 우리의 패키지를 사용하여 C++11.
나는 다음과 같은 질문:
-사이의 관계는 무엇인가CXX
과CXX98
,CXX11
과CXX14
?
-의 의미는 무엇인가,예를 들어,CXX11STD=-std=c++11
는 경우 C++11 는 이미 암시된? 은 그것을 선택 사-std=c++11
과-std=gnu++11
? 해야-std=gnu++11
일반적으로 피할 수 휴대 이유?
-할 수 있는 플래그를 위한CXXSTD
과CXXFLAGS
단지 추가할CXX
,그러한 첫 번째 세 줄 줄CXX=g++-std=c++11-fsanitize=undefined,주소-fno-생략 프레임 포인터
. 장점은 무엇인가에서 명시적으로 지정하는CXXSTD
과CXXFLAGS
?
-어떻게CXX_STD=CXX11
일하는가? 어떻게CXX11
여기에 관련된CXX11``에서~/.R/Makevars
?
-사이의 관계는 무엇인가CXXFLAGS
과PKG_CXXFLAGS
(에 포함되지 않은 나를 들어)?
내가 알고 있는 정보에 포함되R 쓰기장R 설치 및 관리지만,나는 할 수 없 더 많은 정보를 추출을 넘어 내 현재 이해의 수준을은 위의 질문에 대답합니다.
내가 추가하는Rcpp
태그기 때문에 나는 이러한 질문에 대한 답변을 것이 가장 관련하여 사용자의Rcpp
,그러나 내가 알고 있는 이것은 아마 직접 관련되지 않은Rcpp
,이렇게 태그 제거될 수 있는 것으로 간주하는 경우 적합합니다.
는Makevars
파일에서 지정된쓰 R 확장자:1.2.1 를 사용하여 Makevars,의 변형[확인
](https://www.gnu.org/software/make/manual/make.html 는)unique 을 R. 많은 변수가 있다는 암시적 변수](https://www.gnu.org/software/make/manual/make.html#Using-Implicit). 의미가 주어진다:
암시적 규칙에게 말을 사용하는 방법 습관적인 기술이 그렇게 당신이 지정하지 않아도 그들을 세부 사항에서 사용하고 싶을 때 그들을. 이러한암시적 변수 지시 what 컴파일러를 사용하여야 하며 what 옵션을 사용할 수 있습니다. 내 R,우리는 케어에 대해 다음과 같은 기본 컴파일러 옵션: CC프로그램를 위한 컴파일하는 C 프로그램의 기본'cc'.
CXX프로그램 컴파일을 위한 C++프로그램의 기본 g++'.
CPP프로그램 실행하기 위한 C 선처리기로 결과를 표준출력,기본값'$(CC)-E'.
FC프로그램를 위한 컴파일하는 전처리 프로그램 및 Ratfor 프로그램의 기본'f77'.
다음 설정 값의 세부 사항 what 옵션을 사용해야 하는 컴파일러입니다. 일반적으로,기본값으로 이러한 모든 옵션은 빈 문자열입니다.
CFLAGS추가 깃발을 제공 하는 C 컴파일러입니다.
CXXFLAGS추가 깃발을 제공 하는 C++컴파일러입니다.
CPPFLAGS추가 깃발을 제공할 C 선처리기와 프로그램을 사용하는 그것(C 프로그램 컴파일러).
FFLAGS추가 깃발을 제공하 Fortran compiler.
LDFLAGS추가 깃발을 제공하는 컴파일러면 그들은 해야하는 호출을 링커,'ld'등 L. 라이브러리(-lfoo)추가해야 을 LDLIBS 변수다.
LDLIBS라이브러리를 아래 주어진 이름을 컴파일러면 그들은 해야하는 호출을 링커,'ld'. LOADLIBES 은 사용되지 않는다(하지만 도 지원)대 LDLIBS. 비 라이브러리 linker flags,러 로-L,이동해야에서 LDFLAGS 변수입니다. 지금 R 정"extra"개의 측면에서 다양한 C++ISO 표준입니다. 이 개는 주에[R Administration:2.7.2C++지원](https://cran.r-project.org/doc/manuals/r-release/R-admin.html#C_002b_002b-Support 고)R Administration:B.7 컴파일드 플래그 CXX98 CXX98STD CXX98FLAGS CXX98PICFLAGS
CXX11 CXX11STD CXX11FLAGS CXX11PICFLAGS
CXX14 CXX14STD CXX14FLAGS CXX14PICFLAGS
CXX17 CXX17STD CXX17FLAGS CXX17PICFLAGS
이것을 말하고,그's 를 해결 첫 번째 질문: 사이의 관계는 무엇인가
CXX
과CXX98
,CXX11
과CXX14
?CXX
은 일반적인 컴파일러 옵션을 사용합니다. 한편,R 정의하는 추가적인CXX
을 사용하는 옵션에 따라 발견되는 컴파일 표준입니다. 즉,이 경우-std=c++98
(CXX98
언어 spec)에 의해 설정CXX_STD
,컴파일러와 관련된CXX98
이 사용됩니다. 마찬가지로CXX11
과CXX14
,같은 논리로 다음과 같습니다. 볼Rcpp 갤러리를 사용:Rcpp C++11,C++14C++17가 많이 있습니다.의 의미는 무엇인가,예를 들어,
CXX11STD=-std=c++11
는 경우 C++11 는 이미 암시된? 은 그것을 선택 사-std=c++11
과-std=gnu++11
? 해야-std=gnu++11
일반적으로 피할 수 휴대 이유? 의미의CXX11STD
를 결정하는 것이 적절한 언어로 표준에 대한 C++11 컴파일. 이 옵션이 존재하기 때문에 단순히 경우 R's 버전을 선택하는 적절한 C++11 옵션을 컴파일이 잘못되었을 위한 컴파일러는,당신은 그것을 변경할 수 있습니다. 이유가 존재하기 때문에 각 컴파일러를 정의할 수 있습 C++11 원가 약간 다르게 보다 다음으로 나타내에R 설치 및 관리:2.7.2C++지원: 될 수 있[각주 13]없다는 것을 적당한 플래그를 위한 C++11,지원하는 경우 다른 컴파일러를 선택할 수 있습에 대한 CXX11 와 그에 상응하는 플래그입니다. 각주 13: 이것은 사실 이전 버전은 g++같은 4.2.1 에도 일반적으로 사용되는 버전의 솔라리스 컴파일러 CC. 에 대한 자세한 내용은 언어로 기준에 의해 승인 gcc 볼GCC 설명서:3.4 옵션을 제어하는 C 방언. 또한,사용하는 방법에 대한 자세한 내용은 C++11R 패키지에서 참조쓰 R 확장자:Section1.2.4 를 사용하여 C++11 코드. 일반적으로,내가 피할 것 이라고 명시적으로 이 변수를 설정. 해야 하는 경우 명시적으로 설정 변수,나는 추천할 것-std=c++11
로의 대부분을 컴파일러 지원이 선언입니다.할 수 있는 플래그를 위한
CXXSTD
과CXXFLAGS
단지 추가할CXX
,그러한 첫 번째 세 줄 줄CXX=g++-std=c++11-fsanitize=undefined,주소-fno-생략 프레임 포인터
. 장점은 무엇인가에서 명시적으로 지정하는CXXSTD
과CXXFLAGS
? 이것이 가능합니까? 그렇습니다. 그것은 바로? No. 왜 three 변수가 각각 자신의 목표를 할 때 우리는 단순히 수가 있나? 의 장점 three 변수 워크플로우를 제공하는 다른 선을 각각의 고유한 역할이 있습니다. 이것은 능력을 신속하게 이해하의 컴파일 옵션입니다. 따라서,그것은 훨씬 더 똑바로 앞으로 grok 비교했을 때는 그것이 가득으로 중 하나의 변수 중 하나인(는 터미널의 폭 80). 예:
CXX = g++ -std=c++11 -fsanitize=undefined,address -fno-omit-frame-pointer
대
CXX = g++
CXX11STD = -std=c++11
CXXFLAGS = -fsanitize=undefined,address -fno-omit-frame-pointer
CXX_STD
통해CXXSTD
때로 포장에 표시된쓰 R 확장자:Section1.2.4 를 사용하여 C++11 코드. 이것은 단순히 지키는 R 는 등록된 패키지를 요구하는 것으로 C++xy. 대체를 쓰는 것에서설명
파일을 특성SystemRequirements:C++xy
,는xy
을 나타냅니다. 어떻게
CXX_STD
=CXX11
일하는가? 어떻게CXX11
여기에 관련된CXX11
에서~/.R/Makevars? 이 세트는 컴파일하고 연결하는 언어에 대해 수행하는 C++11 컴파일러에 의해 설정된CXX11
. 을 지정하여CXX11
,당신은 지정[변수에확인
](https://www.gnu.org/software/make/manual/make.html#Using-Variables 는)사용될 것이를 컴파일하려면 아래에 있는 파일의 레시피는:
$(OBJCXX) $(ALL_CPPFLAGS) $(ALL_OBJCXXFLAGS) -c $< -o $@
$(OBJCXX)
은CXX
,$(ALL_CPPFLAGS)
의해 주어진$(R_XTRA_CPPFLAGS)$(PKG_CPPFLAGS)$(CLINK_CPPFLAGS)$(CPPFLAGS)
,그리고$(ALL_OBJCXXFLAGS)
는$(PKG_OBJCXXFLAGS)$(CXXPICFLAGS)$(SHLIB_CXXFLAGS)$(OBJCXXFLAGS)
.
위의 다음/R/Makeconf.in
. 그러나 일상적인 수/m4/R
. 사이의 관계는 무엇인가
CXXFLAGS
과PKG_CXXFLAGS
(에 포함되지 않은 나를 들어)? 이들 모두를 지정 컴파일러는's 컴파일 플래그입니다. 는 순서에 기록Makevars
은 다릅니다. 특히,우리는CXXFLAGS
배치 afterPKG_CXXFLAGS
. 의 right 대부분의 옵션을 사용하는 것이 always 사용됩니다. 그래서,CXXFLAGS
보다 우선PKG_CXXFLAGS
. 거기에 간단한 메모`PKG_*옵션에서쓰 R 확장자:절 5.5Creating shared objects.부록
다음과 같은 질문을 했었@도미니크에서 이 응답입니다.
그것이 정확한지는 변수에 정의된
~/.R/Makevars
전 세계적으로 적용하여 설치의 모든 패키지는 변수에는/src/Makevars
만 적용해 현재의 패키지? 그렇습니다. 이것은 정확합니다. 변수 내에서~/.R/Makevars
모든 패키지에 적용됩는 동안/src/Makevars
와 함께 제공되는 각 패키지에만 영향을 설정하는 패키지입니다. 에서 값이/src/Makevars
보다 우선적으로 적용됩~/.R/Makevars
. 패키지 할 수 있습으로/src/Makevars.win
을 제공하는Makevars
파일을 위해 특별히 Windows 환경이다.은 컴파일을 사용하는 표준에 대한 요즘 패키지에만 설정을 통해
CXX_STD
과 더 이상으로PKG_CXXFLAGS
과 같이 gallery.rcpp.org/articles/simple-lambda-func-c++11? 약간의 차이를 이러한 두 가지 플래그를 사용해야 합니다. 특히,CXX_STD
만 운영상의 패키지에서 환경입니다. 한편,반대하는 그 이름,PKG_CXXFLAGS
,영향을 미치는 모든 컴파일 옵션이 있습니다. 따라서,때 당신을 인용하는 위 Rcpp 갤러리,게시물을 관찰하는 스크립트되고 실행됩니다. 을 신속하게 참여하는 올바른 모드로이 필요한PKG_CXXFLAGS
을 설정하고 발견하는CXX_STD
정의합니다. 지금,나를 용서에 대 한 간략한 접선의 역사에 standalone use 컴파일 옵션이 있습니다.... 의 사용PKG_CXXFLAGS
은 약간 오래된 학교입니다. 사실,선호하는 방법에 R3.4 은 환경 변수를 설정USE_CXX11="예"
입니다. 사이 R3.1R3.3,표준을 설정된 환경 변수USE_CXX1X="예"
입니다. 하기 전에 해당 인스턴스의 사용PKG_CXXFLAGS="-std=c++11"
이 좋습니다. (제외하고,윈도우에서는 필요한PKG_CXXFLAGS="-std=c++0x"
입니다.)가 사용하는
CXX_STD=CXX11
그런 말을 사용하여 모든 설정에 의해 주어진CXX
,CXXSTD
,CXXFLAGS
과CXX11PICFLAGS
? No. 이 옵션을 사용하여 설정: CXX11 CXX11STD CXX11FLAGS CXX11PICFLAGS