2015-05-14 15 views
20

Obecnie wykonuję niektóre wyzwania związane z projektem Eulera w języku C za pomocą IDE JetBrains CLion. Kiedy je ukończyłem w Pythonie i Javie (odpowiednio w PyCharm i IntelliJ), zawsze byłem w stanie stworzyć pojedynczy projekt o nazwie "ProjectEuler" i dodać dowolną liczbę plików źródłowych, które mogłem wykonać niezależnie. Wydaje się jednak, że w CLion nie jest to możliwe. Każdy z plików źródłowych, których używam do rozwiązania problemu, zawiera funkcję main(), a CMake jest niezadowolony z tego za każdym razem, gdy próbuję się skompilować ("wiele definicji" głównego ").Czy można skonfigurować CLION do samodzielnego kompilowania plików źródłowych w projekcie?

Czy istnieje sposób, aby skonfigurować CLION tak, aby kompilował i wykonywał pojedynczy plik źródłowy w projekcie za jednym razem, bez konieczności przepisywania mojego CMakeLists.txt lub tworzenia nowego projektu dla każdego problemu za każdym razem?

Jestem świadomy, że C jest kompilowany i nie interpretowany jak Java czy Python, ale mógłbym samodzielnie skompilować każdy pojedynczy plik źródłowy. Czy istnieje sposób, aby skonfigurować CLION, aby zrobił to samo? Jeśli tak to jak?

Odpowiedz

26

Można zdefiniować wiele plików wykonywalnych w CMakeLists.txt dla każdego problemu.

zamiast

add_executable(projecteuler ${SOURCE_FILES}) 

można zdefiniować

add_executable(problem1 problem1.c) 
add_executable(problem2 problem2.c) 

Następnie pojawi się dla każdego pliku wykonywalnego (problem1, problem2 itp) konfiguracja run, które można uruchomić niezależnie od siebie. W takim przypadku nie będziesz musiał przepisywać za każdym razem, zamiast tego po prostu dodasz nowy plik źródłowy do nowego pliku wykonywalnego.

+0

Nie ma sposobu, aby CLION automatycznie dodał źródło? Wiem, że to nie jest dużo, ale może być lepiej – InvisibleUn1corn

+0

Jeśli dodasz nowe źródło lub plik nagłówkowy C++, możesz zaznaczyć "Dodaj do celów", a następnie wybrać cele/pliki wykonywalne, do których chcesz dodać plik w CMakeLists. tekst. Ale cel musi już być w pliku CMakeLists.txt. – ipa

+1

@ InvisibleUn1corn Zgadzam się, że to miłe, jeśli możemy dodać 'add_executable' łatwiej. W tym celu stworzyłem wtyczkę dla CLion "[C/C++ Single File Execution Plugin] (http://corochann.com/projects/single-file-execution-plugin)". – corochann

3

Można użyć

cmake_minimum_required(VERSION 2.8.4) 

add_subdirectory(src/prj1) 
add_subdirectory(src/prj2) 

następnie w każdym katalogu utworzyć inną CMakeLists.txt jak ten:

cmake_minimum_required(VERSION 2.8.4) 
project(prj1) 

set(EXEC_NAME prj1) 

set(SOURCE_FILES 
    main_prj1.cpp 
    x.cpp 
    y.cpp 
) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

set(EXECUTABLE_OUTPUT_PATH ../../dist/${CMAKE_BUILD_TYPE}) 

add_executable(${EXEC_NAME} ${SOURCE_FILES}) 

Można użyć file(GLOB SOURCE_FILES *.cpp) jeśli chcesz automatycznie dodać pliki w kompilacji. Pamiętaj jednak, że ta "sztuczka" nie jest silnie wspierana.

Spowoduje to również automatyczne dodanie konfiguracji kompilacji do CLion.

0

Możesz dodać te linie do swojego CMakeLists.txt.

#GLOB_RECURSE will find files in all subdirectories that match the globbing expressions and store it into the variable. 
    file(GLOB_RECURSE APP_SOURCES *.c) 
    foreach (testsourcefile ${APP_SOURCES}) 
     #get filename without extension 
     get_filename_component(testname ${testsourcefile} NAME_WE) 
     #add executable for all file 
     add_executable(${testname} ${testsourcefile}) 
    endforeach (testsourcefile ${APP_SOURCES}) 

Będziesz musiał przeładować projektu CUpewnij (Narzędzia -> CUpewnij) za każdym razem dodawać lub usuwać pliki ze swojego projektu. Czas budowy również wzrośnie, jeśli dodasz większą liczbę plików. Alternatywnie możesz stworzyć więcej katalogów i podkatalogów i użyć file(GLOB_RECURSE APP_SOURCES path/to/*.c), więc zbuduje tylko te pliki.