2015-05-14 10 views
20

Attualmente sto affrontando alcune sfide di Project Euler in C utilizzando l'IDE CLion JetBrains. Quando ho completato questi in Python e Java (rispettivamente in PyCharm e IntelliJ), sono sempre stato in grado di creare un singolo progetto denominato "ProjectEuler" e aggiungere qualsiasi numero di file sorgente che potessi eseguire indipendentemente. Tuttavia, sembra che lo stesso non sia possibile in CLion. Ognuno dei file sorgente che uso per risolvere un problema contiene una funzione main(), e CMake non è soddisfatto di ciò ogni volta che tento di compilare ("definizione multipla di 'main'").È possibile configurare CLion per compilare i file sorgente in un progetto in modo indipendente?

C'è un modo per configurare CLion per compilare ed eseguire un singolo file sorgente in un progetto alla volta senza dover riscrivere il mio CMakeLists.txt o creare un nuovo progetto per ogni problema ogni volta?

Sono consapevole del fatto che C è compilato e non interpretato come Java o Python, ma potrei concepibilmente compilare manualmente ogni singolo file sorgente. C'è un modo per configurare CLion per fare lo stesso? Se é cosi, come?

risposta

26

È possibile definire più eseguibili in CMakeLists.txt per ogni problema.

anziché

add_executable(projecteuler ${SOURCE_FILES}) 

si potrebbe definire

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

Poi si ottiene per ciascun eseguibile (problem1, problem2 ecc) una configurazione di esecuzione, che è possibile eseguire in modo indipendente. In questo caso non dovrai riscrivere tutte le volte, ma dovrai semplicemente aggiungere il nuovo file sorgente a un nuovo eseguibile.

+0

Non c'è un modo per fare in modo che CLion aggiunga automaticamente la fonte? So che non è molto da aggiungere ma potrebbe essere migliore – InvisibleUn1corn

+0

Se aggiungi un nuovo file sorgente o header C++ puoi selezionare "Aggiungi a target" e quindi selezionare i target/eseguibili in cui desideri aggiungere il file nelle CMakeLists. testo. Ma l'obiettivo deve essere già nel file CMakeLists.txt. – ipa

+1

@ InvisibleUn1corn Sono d'accordo che è bello aggiungere "add_executable" più facilmente. A tale scopo, ho creato un plugin per CLion "[C/C++ Single File Execution Plugin] (http://corochann.com/projects/single-file-execution-plugin)". – corochann

3

È possibile utilizzare

cmake_minimum_required(VERSION 2.8.4) 

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

poi in ogni directory creare un altro CMakeLists.txt come questo:

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}) 

È possibile utilizzare file(GLOB SOURCE_FILES *.cpp) se si desidera aggiungere automaticamente i file nella compilation. Ma tieni presente che questo "trucco" non è fortemente incoraggiato.

Ciò aggiungerà automaticamente anche configurazioni di build a CLion.

0

È possibile aggiungere queste righe a 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}) 

Si dovrà ricaricare progetto CMake (Strumenti -> CMake) ogni volta che si aggiungono o eliminano i file dal progetto. Anche il tempo di costruzione aumenta se si aggiunge più numero di file. In alternativa è possibile creare più directory e sottodirectory e utilizzare file(GLOB_RECURSE APP_SOURCES path/to/*.c) in modo da creare solo quei file.

Problemi correlati