우분투 14.04 LTS를 사용하고 있습니다. 이건 패키지로 배송됐어요gcc
4.8.4하지만 저는 더 높은 버전을 원합니다 gcc
.
기존 버전 4.8.4를 사용하여 구축했습니다.4.9.4소스 코드에서 전달됨권장 체인 컴파일-빌드-테스트-설치. ./configure
접두사 디렉터리와 프로그램 접미사 이외의 외부 설정은 사용하지 않습니다. 나머지는 기본값입니다. 모든 일이 잘 진행되고 있는 것 같습니다. 테스트 요약에는 g++
FAIL이 없고 XPASS 호출이 2번만 표시됩니다.
XPASS: g++.dg/tls/thread_local-order2.C -std=c++11 execution test
XPASS: g++.dg/tls/thread_local-order2.C -std=c++1y execution test
그런 다음 버전을 만들고 싶습니다.5.4.0새로 설치된 4.9.4를 사용하여 최소한의 학습 곡선으로 후자를 테스트하십시오. make
플래그 와 .CC
CXX
이제 이러한 플래그는 4.9.4 설치 디렉터리의 바이너리를 가리킵니다.
이것구성5.4.0 단계는 순조롭게 진행되고 있습니다. 파일에서 새 바이너리의 경로가 올바르게 읽혀지는 config.log
것을 확인했습니다.Makefile
이것세워그러나 단계가 실패하고 stderr
약 100개의 오류를 보고합니다. 가장 초기이자 가장 빈번한 유형은 다음과 같습니다.
`error: template with C linkage`
`error: template specialization with C linkage`
다음과 같은 블록으로 제공됩니다.
In file included from ${installation directory for 4.9.4}/include/c++/4.9.4/bits/stringfwd.h:40:0,
from ${installation directory for 4.9.4}/include/c++/4.9.4/iosfwd:39,
from /usr/include/x86_64-linux-gnu/gmp.h:25,
from /usr/local/include/isl/val_gmp.h:4,
from ${source directory for 5-4-0}/gcc/graphite-isl-ast-to-gimple.c:35:
${installation directory for 4.9.4}/include/c++/4.9.4/bits/memoryfwd.h:63:3: error: template with C linkage
template<typename>
^
${installation directory for 4.9.4}/include/c++/4.9.4/bits/memoryfwd.h:66:3: error: template specialization with C linkage
template<>
^
${installation directory for 4.9.4}/include/c++/4.9.4/bits/memoryfwd.h:70:3: error: template with C linkage
template<typename, typename>
^
5.4.0 소스코드는 4.9.4와 동일하게 모든 정보를 수집하고 처리하기 때문에 좋다고 생각합니다. 4.9.4나 5.4.0 또는 둘 다의 구성 단계에서 오류/누락이 있을 수 있습니다.
이러한 오류는 어떤 결함을 나타냅니까? 어떻게 고치나요?
당신의 생각에 감사드립니다.
StackExchange에 대한 검색어에서는 error: template with C linkage
약 171,000개의 결과가 나왔습니다. 내가 찾아본 게시물에서는 이 문제를 다루지 않는 것 같습니다.
https://stackoverflow.com/questions/4115930/using-cygwin-to-build-template-with-c-linkage
나는 코드를 분류하는 데 관심이 없고 오히려 (강력한) 작동하는 컴파일러를 설정하는 데 관심이 있습니다.
답변1
--with-local-prefix=/usr
이 문제는 쉘 스크립트의 컴파일 스위치를 설정하여 방지되었습니다 configure
. 기본값은 /usr/local
이며 우분투는 찾는 파일을 다음 위치에 저장하는 것 같습니다./usr
.https://unix.stackexchange.com/a/346171/132913)
그러나 이 설정은 권장되지 않습니다. 보다GCC 온라인 구성 도움말:
--with-local-prefix=디렉토리 이름
로컬 포함 파일의 설치 디렉터리를 지정합니다.기본값은 /usr/local입니다.. 컴파일러가 디렉토리를 검색하도록 하려면 이 옵션을 지정하십시오.디렉토리 이름/포함대신 로컬에 설치된 헤더 파일의 경우/usr/로컬/포함.
사이트에 사이트별 파일을 배치할 위치에 대한 다른 규칙이 있는 경우에만 --with-local-prefix를 지정해야 합니다(/usr/local 제외).
--prefix 값에 관계없이 --with-local-prefix의 기본값은 /usr/local입니다. --prefix를 지정하면 GCC가 로컬 헤더 파일을 검색하는 디렉터리에 영향을 주지 않습니다. 이는 반직관적으로 보일 수도 있지만 실제로는 논리적입니다.
--prefix의 목적은 GCC가 설치된 위치를 지정하는 것입니다. /usr/local/include의 로컬 헤더 파일(해당 디렉토리에 파일을 넣은 경우)은 GCC의 일부가 아닙니다. 그것들은 다른 프로젝트의 일부입니다. 아마도 다른 많은 프로젝트일 것입니다. (GCC는 --prefix 값을 기반으로 다른 디렉터리에 자체 헤더 파일을 설치합니다.)
로컬 접두사 포함 디렉터리와 GCC 접두사 포함 디렉터리는 모두 GCC "시스템 포함" 디렉터리의 일부입니다. 이 두 디렉터리는 고정되어 있지 않지만 include_next 지시어가 올바르게 처리되려면 올바른 순서로 검색해야 합니다. 로컬 접두사 포함 디렉터리는 GCC 접두사 포함 디렉터리보다 먼저 검색됩니다. 시스템 포함 디렉토리의 또 다른 기능은 이러한 디렉토리의 헤더에 대한 현명한 경고가 꺼진다는 것입니다.
일부 autoconf 매크로는 설치된 패키지 헤더가 포함된 디렉터리가 검색되도록 컴파일러 명령줄에 -I 디렉터리 옵션을 추가합니다. 디렉토리가 GCC의 시스템 포함 디렉토리 중 하나인 경우 GCC는 시스템 디렉토리가 올바른 순서로 계속 처리되도록 이 옵션을 무시합니다. 이로 인해 검색 순서가 지정된 순서와 다를 수 있지만 디렉터리는 계속 검색됩니다.
GCC는 GCC_EXEC_PREFIX를 사용하여 공통 라이브러리를 자동으로 검색합니다. 따라서 GCC와 패키지가 동일한 설치 접두사를 사용하면 GCC는 자동으로 헤더와 라이브러리를 검색합니다. 이는 사용하기 쉬운 구성을 제공합니다. GCC는 /usr에 시스템 컴파일러로 설치된 경우와 유사하게 작동합니다.
여러 버전의 GCC를 설치해야 하는 사이트에서는 위의 간단한 구성을 사용하지 않을 수 있습니다. --program-prefix, --program-suffix 및 --program-transform-name 옵션을 사용하여 여러 버전을 단일 디렉터리에 설치할 수 있지만, 다른 접두사와 --with-local-을 사용하는 것이 더 간단할 수 있습니다. 접두사 옵션이 지정되었습니다. 각 버전에 대한 사이트별 파일의 위치입니다. 그런 다음 사용자는 로컬 사이트 라이브러리의 위치를 명시적으로 지정해야 합니다(예: LIBRARY_PATH 사용).
/usr이 아닌 경우 --with-local-prefix 및 --prefix에 동일한 값을 사용할 수 있습니다. 이는 /usr/local/include에 대한 기본 검색을 방지하는 데 사용할 수 있습니다.
/usr을 --with-local-prefix로 지정하지 마십시오! --with-local-prefix에 사용되는 디렉터리에는 시스템의 표준 헤더 파일이 포함되어서는 안 됩니다. 일부 프로그램은 해당 프로그램을 포함하는 경우(일부 대상의 GNU Emacs 포함) 잘못 컴파일됩니다. 이는 fixincludes 스크립트에 의해 수정된 헤더 파일을 덮어쓰고 실행 취소하기 때문입니다.
이 옵션을 사용하는 사람들은 목적에 대한 오해로 인해 이 옵션을 사용하고 있다는 징후가 있습니다. 사람들은 GCC의 일부가 설치되는 위치를 지정하는 것처럼 이를 사용합니다. 어쩌면 GCC를 설치하면 디렉토리가 생성되기 때문에 이런 가정을 했을 수도 있습니다.
이러한 불일치에 대해서는 조만간 다른 기사에서 다루겠습니다.