2015-05-14 99 views
20

我目前正在使用JetBrains CLion IDE在C中进行一些Project Euler挑战。当我用Python和Java完成这些工作时(分别在PyCharm和IntelliJ中),我总是能够创建一个名为“ProjectEuler”的项目并添加任意数量的可独立执行的源文件。但是,CLion似乎也不可能。我用来解决问题的每个源文件都包含一个main()函数,而CMake每次尝试编译时都不满意(“main'的多重定义”)。是否可以配置CLion独立编译项目中的源文件?

有没有办法配置CLion一次只编译和执行项目中的单个源文件,而无需每次都重写我的CMakeLists.txt或为每个问题创建一个新项目?

我知道C编译并不像Java或Python解释,但我可以想象,只是手动编译每一个源文件。有没有办法配置CLion做同样的事情?如果是这样,怎么样?

回答

26

您可以在每个问题的CMakeLists.txt中定义多个可执行文件。

代替

add_executable(projecteuler ${SOURCE_FILES}) 

你可以定义

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

然后你为每个可执行文件(问题1,problem2等)运行配置,你可以独立运行。在这种情况下,您不必每次重写,而只需将新的源文件添加到新的可执行文件。

+0

有没有办法让CLion自动添加源代码?我知道添加它并不多,但它可能会更好 – InvisibleUn1corn

+0

如果添加新的C++源代码或头文件,您可以选中“添加到目标”,然后选择要在CMakeLists中添加文件的目标/可执行文件。文本。但目标必须已经在CMakeLists.txt文件中。 – ipa

+1

@ InvisibleUn1corn我同意,如果我们可以更轻松地添加'add_executable',这很好。为此,我为CLion制作了一个插件“[C/C++单一文件执行插件](http://corochann.com/projects/single-file-execution-plugin)”。 – corochann

3

您可以使用

cmake_minimum_required(VERSION 2.8.4) 

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

然后在每个目录下创建一个其他的CMakeLists.txt像这样的:

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

您可以使用file(GLOB SOURCE_FILES *.cpp),如果你想在你的编译自动添加文件。但请记住,这个“伎俩”是强烈的不鼓励。

这也会自动将构建配置添加到CLion。

0

您可以将这些行添加到您的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}) 

每次添加或删除项目中的文件时,都必须重新加载cmake项目(工具 - > Cmake)。如果添加更多数量的文件,构建时间也会增加。另外,你可以创建更多的目录和子目录,并使用file(GLOB_RECURSE APP_SOURCES path/to/*.c),因此它只会构建这些文件。

相关问题