Mój system operacyjny to centos, który ma domyślną ścieżkę gcc /usr/bin/gcc
. Ale jest stara, potrzebuję nowej wersji gcc. Więc instaluję nową wersję w nowej ścieżce /usr/local/bin/gcc
.
Ale kiedy uruchamiam cmake
, nadal używa starej wersji ścieżki gcc ( /usr/bin/gcc
). Jak mogę określić gcc do nowej ścieżki ( /usr/local/bin/gcc
).
Próbowałem nadpisać /usr/bin/gcc
z /usr/local/bin/gcc
, ale to nie działa.
/opt
zamiast/usr/local
. Najlepiej/opt/gcc-x.y.z
. W ten sposób, jeśli potrzebujesz jeszcze nowszej wersji, nie będziesz mieć problemów z odinstalowaniem poprzedniej.Odpowiedzi:
Nie nadpisuj
CMAKE_C_COMPILER
, ale eksportujCC
(iCXX
) przed wywołaniem cmake:Eksport należy wykonać tylko raz, przy pierwszej konfiguracji projektu, a następnie te wartości zostaną odczytane z pamięci podręcznej CMake.
AKTUALIZACJA : dłuższe wyjaśnienie, dlaczego nie zastąpić
CMAKE_C(XX)_COMPILER
po komentarzu Jake'aOdradzam zastępowanie tej
CMAKE_C(XX)_COMPILER
wartości z dwóch głównych powodów: ponieważ nie działa dobrze z pamięcią podręczną CMake i ponieważ przerywa sprawdzanie kompilatora i wykrywanie narzędzi.Korzystając z
set
polecenia, masz trzy opcje:Zobaczmy, co się stanie w przypadku trzech możliwych wywołań
set
:Bez pamięci podręcznej
Robiąc to, tworzysz „normalną” zmienną,
CMAKE_C(XX)_COMPILER
która ukrywa zmienną pamięci podręcznej o tej samej nazwie. Oznacza to, że Twój kompilator jest teraz zakodowany na stałe w skrypcie kompilacji i nie możesz nadać mu niestandardowej wartości. Będzie to problem, jeśli masz wiele środowisk kompilacji z różnymi kompilatorami. Możesz po prostu zaktualizować skrypt za każdym razem, gdy chcesz użyć innego kompilatora, ale to przede wszystkim usuwa wartość używania CMake.Ok, więc zaktualizujmy pamięć podręczną ...
Z cache
Ta wersja po prostu „nie będzie działać”.
CMAKE_C(XX)_COMPILER
Zmienna jest już w pamięci podręcznej, dzięki czemu nie będą aktualizowane, chyba że zmusi go.Ach ... użyjmy siły, więc ...
Wymuś pamięć podręczną
Jest to prawie to samo, co „normalna” wersja zmiennej, jedyną różnicą jest to, że wartość zostanie ustawiona w pamięci podręcznej, aby użytkownicy mogli ją zobaczyć. Ale każda zmiana zostanie nadpisana przez
set
polecenie.Łamanie kontroli i narzędzi kompilatora
Na początku procesu konfiguracji CMake sprawdza kompilator: czy to działa? Czy jest w stanie produkować pliki wykonywalne? itd. Używa również kompilatora do wykrywania powiązanych narzędzi, takich jak
ar
iranlib
. Kiedy przesłonisz wartość kompilatora w skrypcie, jest „za późno”, wszystkie sprawdzenia i wykrycia są już wykonane.Na przykład, na moim komputerze z domyślnym kompilatorem gcc, gdy używasz
set
polecenia to/usr/bin/clang
,ar
jest ustawiony na/usr/bin/gcc-ar-7
. W przypadku używania eksportu przed uruchomieniem CMake jest ustawiony na/usr/lib/llvm-3.8/bin/llvm-ar
.źródło
which gcc
> export CXX =which g++
export CC=`which gcc` export CXX=`which g++`
Incorrect 'gcc' version 'compiler.version=5.3' is not the one detected by CMake: 'GNU=4.8'
CMAKE_C_COMPILER
działa dobrze pod warunkiem, że robią to za pomocą wiersza polecenia:$ cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ /path/to/source
.To pytanie jest dość stare, ale wciąż pojawia się w wyszukiwarce Google. Przyjęte pytanie już dla mnie nie działało i wydaje się, że jest stare. Najnowsze informacje o cmake znajdują się w FAQ cmake .
Istnieją różne sposoby zmiany ścieżki kompilatora. Byłby jeden sposób
zamiast
gcc-4.2
ciebie możesz napisaćpath/to/your/compiler
takźródło
Podążaj
CMAKE_C_COMPILER
nową ścieżką.Zobacz tutaj: http://www.cmake.org/Wiki/CMake_Useful_Variables
źródło
Eksport powinien określać, której wersji GCC / G ++ użyć, ponieważ jeśli użytkownik miałby wiele wersji kompilatora, kompilacja nie powiodłaby się.
W przypadku, gdy projekt używa C ++ 11, można to zrobić za pomocą
-std=C++-11
flagi w CMakeList.txtźródło
Alternatywnym rozwiązaniem jest skonfigurowanie projektu za pomocą cmake-gui, zaczynając od czystego katalogu kompilacji. Wśród opcji dostępnych na początku jest możliwość wybrania dokładnej ścieżki do kompilatorów
źródło
Działa to nie tylko
cmake
, ale także./configure
imake
:Co powoduje:
źródło
Zmień
CMAKE_<LANG>_COMPILER
ścieżkę bez uruchamiania ponownej konfiguracjiChciałem skompilować z alternatywnym kompilatorem, ale także przekazać opcje -D w wierszu poleceń, które zostałyby wymazane przez ustawienie innego kompilatora. Dzieje się tak, ponieważ powoduje to ponowną konfigurację. Sztuczka polega na tym, aby wyłączyć wykrywanie kompilatora za pomocą
NONE
, ustawić ścieżki za pomocąFORCE
, a następnieenable_language
.Użyj pliku Toolchain
Bardziej rozsądnym wyborem jest utworzenie pliku łańcucha narzędzi.
Następnie wywołujesz Cmake z dodatkową flagą
źródło