2013-06-24 9 views
53

Mój OS to centos, który ma domyślny gcc w ścieżce /usr/bin/gcc. Ale jest stary, potrzebuję nowej wersji gcc. Dlatego instaluję nową wersję w nowej ścieżce /usr/local/bin/gcc.jak określić nową ścieżkę gcc dla cmake

Ale kiedy uruchomię cmake, nadal używa starej ścieżki gcc wersji (/usr/bin/gcc). Jak mogę określić gcc na nową ścieżkę (/usr/local/bin/gcc).

Próbowałem zastąpić /usr/bin/gcc z /usr/local/bin/gcc, ale to nie działa.

Odpowiedz

114

Nie nadpisać CMAKE_C_COMPILER, ale eksport CC (i CXX) przed wywołaniem cmake:

export CC=/usr/local/bin/gcc 
export CXX=/usr/local/bin/g++ 
cmake /path/to/your/project 
make 

Wywóz musi tylko zrobić raz, po raz pierwszy skonfigurować projektu, wówczas wartości te będą odczytywane z pamięci podręcznej CMake.


UPDATE: dłuższe wyjaśnienie, dlaczego nie nadrzędnymi CMAKE_C(XX)_COMPILER po komentarzu Jake'a

ja odradzam nadrzędne wartości CMAKE_C(XX)_COMPILER z dwóch głównych powodów: ponieważ nie będzie grać dobrze z pamięci podręcznej CUpewnij i dlatego, że powoduje przerwanie sprawdzania kompilatora i wykrywanie oprzyrządowania.

Przy użyciu komendy set, masz trzy opcje:

  • bez pamięci podręcznej w celu stworzenia normalnej zmiennej
  • z pamięci podręcznej, aby utworzyć w pamięci podręcznej zmienną
  • siły cache, aby zawsze wymusić wartość cache podczas konfigurowania

Zobaczmy, co dzieje się na trzech możliwych połączeń do set:

Bez pamięci podręcznej

set(CMAKE_C_COMPILER /usr/bin/clang) 
set(CMAKE_CXX_COMPILER /usr/bin/clang++) 

Kiedy ten sposób można utworzyć „normalną” zmienną CMAKE_C(XX)_COMPILER że ukrywa zmienną cache o tej samej nazwie. Oznacza to, że twój kompilator jest teraz zakodowany na stałe w twoim skrypcie budowania i nie możesz nadać mu niestandardowej wartości. Będzie to problemem, jeśli masz wiele środowisk kompilacji z różnymi kompilatorami. Możesz po prostu zaktualizować swój skrypt za każdym razem, gdy chcesz użyć innego kompilatora, ale to w pierwszej kolejności usuwa wartość używania CMake.

Ok, to, powiedzmy zaktualizować cache ...

Z cache

set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "") 
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "") 

Ta wersja będzie po prostu "nie działa".Zmienna CMAKE_C(XX)_COMPILER znajduje się już w pamięci podręcznej, więc nie będzie aktualizowana, dopóki jej nie wymusisz.

Ach ... użyjmy siłę, potem ...

Siła cache

set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE) 
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE) 

To jest prawie taki sam jak w „normalnej” wersji zmiennej, jedyną różnicą jest twój wartość zostanie ustawiona w pamięci podręcznej, aby użytkownicy mogli ją zobaczyć. Ale każda zmiana zostanie nadpisana przez polecenie set.

Łamanie kontrole kompilatora i oprzyrządowanie

wcześnie w procesie konfiguracji, CUpewnij przeprowadza kontrole na kompilatora: Czy to działa? Czy jest w stanie tworzyć pliki wykonywalne? itp. Używa także kompilatora do wykrywania powiązanych narzędzi, takich jak ar i ranlib. Kiedy nadpisujesz wartość kompilatora w skrypcie, jest "za późno", wszystkie kontrole i detekcje są już wykonane.

Na przykład, na moim komputerze z gcc jako podstawowy kompilator, przy użyciu komendy set do /usr/bin/clang, ar jest ustawiony na /usr/bin/gcc-ar-7. Jeśli używasz eksportu przed uruchomieniem CMake, jest on ustawiony na /usr/lib/llvm-3.8/bin/llvm-ar.

+0

Tak, to działa! Dzięki @Guillaume! – tidy

+0

Odpowiednik dla leniwego, jeśli odpowiednie kompilatory są ustawione w $ PATH: > eksport CC = 'który gcc' > eksport CXX =' który g ++ ' – gerardw

+7

Odpowiednik dla leniwych, jeśli odpowiednie kompilatory są ustawione w twoim $ ŚCIEŻKA: 'export CC = \' który gcc \ ' eksport CXX = \' który g ++ \ '' – gerardw

2

Eksport powinien określać, która wersja GCC/G ++ ma być używana, ponieważ jeśli użytkownik miałby wiele wersji kompilatora, nie zostałby on pomyślnie skompilowany.

export CC=path_of_gcc/gcc-version 
export CXX=path_of_g++/g++-version 
cmake path_of_project_contain_CMakeList.txt 
make 

W przypadku wykorzystania projektu C++ 11 może być obsługiwane za pomocą -std=C++-11 flagę w CMakeList.txt

2

Alternatywnym rozwiązaniem jest skonfigurowanie projektu przez cmake-gui, począwszy od czystej katalogu build . Wśród opcji dostępnych na początku, istnieje możliwość wyboru dokładnej ścieżki do kompilatorów.

Powiązane problemy