2016-10-24 14 views
6

używam CMAKE 3.4.3 w systemie Windows, a ja próbuję zrobić to ustawić ścieżkę w CMAKE i spróbuj odnieść się do tego w moim pliku C++.Odwołując się do zmiennej CMAKE z kodu

co starałem się następująco:

W CMakeLists.txt złożyć

ADD_DEFINITIONS(-DNV12_2_ARGB_PTX_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ptx") 

Teraz próbuję i odnoszą się do niego z moim C++ plik następująco:

#ifdef NV12_2_ARGB_PTX_DIR 
    #define PTX_DIR D_NV12_2_ARGB_PTX_DIR 
#endif 

I kiedy próbuję odnieść się do tego jako:

std::cout << PTX_DIR << std::endl; 

pojawia się błąd:

'C:/Users/Luca/project/src/lib/ptx': No such file or directory 

również, Visual Studio IntelliSense narzeka:

IntelliSense: identifier "PTX_DIR" is undefined 

Nie wiem, dlaczego chce otworzyć plik z tej zmiennej ...

+0

Czy na twoim komputerze istnieje ścieżka 'C:/Users/Luca/project/src/lib/ptx'? Przy okazji, możesz rozważyć [plik konfiguracyjny] (https://cmake.org/cmake/help/latest/command/configure_file.html) dla takich zadań. – wasthishelpful

+0

Ścieżka istnieje, ale dlaczego to musi być prawidłowa ścieżka Nie rozumiem? Jest to zmienna, która może mieć dowolną dowolną wartość. Nie próbuję jeszcze żadnych operacji na plikach. – Luca

Odpowiedz

8

Problem polega na tym, że używasz add_definitions. Skutecznie przekazujesz wartość ${CMAKE_CURRENT_SOURCE_DIR}/ptx jako dodatkowy argument w linii poleceń kompilatora, który prawdopodobnie kompilator interpretuje jako plik źródłowy, który powinien skompilować. Sprawdź pełny wiersz wywoływany, aby się upewnić.

Prawdopodobnie ma to:

add_definitions(-DNV12_2_ARGB_PTX_DIR="${CMAKE_CURRENT_SOURCE_DIR}/ptx") 

pamiętać, że może trzeba się bawić z ucieczki cudzysłowu, aby uzyskać do nich całą drogę w dół do C++. Alternatywnie możesz użyć configure_file().

+0

Ach tak! To się udało. Grałem z komendami 'add_definitions' i' SET', a znak równości zgubił się gdzieś pośrodku! – Luca

+0

Wow, 8 upvotes w ciągu 9 godzin. Oczywiście wspaniała odpowiedź. I świetne pytanie, 7 osób lubi pytanie o literówkę. – usr1234567

+1

@ usr1234567 Gdy CMake oferuje statyczny sprawdzian składni i sprawdzonych procedur, obszerną wstępną i objaśniającą dokumentację bez odniesienia, a gdy jej wyniki staną się łatwiej dostępne niż ustawienia kompilacji rozproszone w wielu plikach systemu kompilacji, pytania literowe stracą swoją wartość. Do tego czasu CMake jest narzędziem o dużym wykorzystaniu, ale słabej użyteczności, gdzie "literówki" i ich konsekwencje mogą być trudne do wykrycia lub zrozumienia, co sprawia, że ​​takie pytania są ważne. Nie wspominając już o tym, że to nie jest literówka, raczej nieporozumienie dotyczące 'add_definitions()'. – Angew

Powiązane problemy