如何告诉我的IDE以特定方式编译我的CMake项目?

时间:2017-10-15 15:52:09

标签: c compilation cmake ide clion

我有一个CMake(主要是C,带有一些C ++)项目,其安装说明如下:

mkdir build
cd build
cmake /*some options*/ ../
make

如果我从命令行编译,这非常有效。

我想使用IDE编译该程序,以便我可以使用图形化调试器对其进行调试。但是,当我尝试使用IDE进行编译时,会出现链接器错误。

我不熟悉CMake的内部工作方式,因此不确定如何实现所需的行为。事实上,我不确定这是否是一个CMake问题;也许这只是IDE配置的问题。如果它有帮助,我使用的IDE是JetBrains的CLion。

IDE中给出的错误是IDE_error

CMake文件是

set(CMAKE_CXX_COMPILER "/Library/Developer/CommandLineTools/usr/bin/c++")
set(CMAKE_C_COMPILER "/Library/Developer/CommandLineTools/usr/bin/cc")
project(mpmc)
cmake_minimum_required(VERSION 3.8)
option(MPI "Use MPI to parallelize the calculations (requires MPI)" OFF)
option(CUDA "Use CUDA to offload polarization calculations to a GPU (requires CUDA)" OFF)
option(OPENCL "Use OpenCL to offload polarization calculations to a GPU (requires OpenCL)" OFF)
option(QM_ROTATION "Enable Quantum Mechanics Rigid Rotator calculations (requires LAPACK)" OFF)
option(VDW "Enable Coupled-Dipole Van der Waals (requires LAPACK)" OFF)


configure_file (
"${PROJECT_SOURCE_DIR}/src/include/cmake_config.h.in"
"${PROJECT_BINARY_DIR}/src/include/cmake_config.h"
)

set(CMAKE_BUILD_TYPE Release)

if(CMAKE_COMPILER_IS_GNUCC)
    set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall")
    set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wall")
endif()

set(LIB m)

set(INCLUDE src/include/ src/mersenne/ ${PROJECT_BINARY_DIR}/src/include)

set(SRC
src/mc/mc_moves.c
src/mc/surface_fit_arbitrary.c
src/mc/qshift.c
src/mc/single_point.c
src/mc/mc.c
src/mc/replay.c
src/mc/pimc.c
src/mc/surface.c
src/mc/surf_fit.c
src/mc/fugacity.c
src/mc/cavity.c
src/mc/checkpoint.c
src/histogram/histogram.c
src/energy/lj_buffered_14_7.c
src/energy/bessel.c
src/energy/dreiding.c
src/energy/energy.c
src/energy/polar.c
src/energy/pbc.c
src/energy/disp_expansion.c
src/energy/vdw.c
src/energy/pairs.c
src/energy/bond.c
src/energy/coulombic_gwp.c
src/energy/exp_repulsion.c
src/energy/coulombic.c
src/energy/sg.c
src/energy/lj.c
src/energy/axilrod_teller.cpp
src/mersenne/mt.c
src/mersenne/dSFMT.h
src/mersenne/dSFMT.c
src/mersenne/dSFMT-common.h
src/mersenne/dSFMT-params.h
src/main/quaternion.c
src/main/CArng.c
src/main/memnullcheck.c
src/main/main.c
src/main/cleanup.c
src/main/usefulmath.c
src/io/dxwrite.c
src/io/simulation_box.c
src/io/average.c
src/io/output.c
src/io/check_input.c
src/io/input.c
src/io/mpi.c
src/io/read_pqr.c
src/io/setup_ocl.c
src/polarization/thole_field.c
src/polarization/polar_wolf_lookup.c
src/polarization/thole_polarizability.c
src/polarization/thole_matrix.c
src/polarization/polar_ewald.c
src/polarization/thole_iterative.c
)

if(MPI)
    message("-- MPI Enabled")
    find_package(MPI REQUIRED)
    if(NOT MPI_C_FOUND)
        message(FATAL_ERROR "-- MPI not found! Exiting ...")
    endif()
    set(INCLUDE ${INCLUDE} ${MPI_C_INCLUDE_PATH})
    set(LIB ${LIB} ${MPI_C_LIBRARIES})
else()
    message("-- MPI Disabled")
endif()

if(CUDA)
    message("-- CUDA Enabled")
    find_package(CUDA REQUIRED)
    set(SRC ${SRC} src/polarization_gpu/polar_cuda.cu)
else()
    message("-- CUDA Disabled")
endif()

if(OPENCL)
    message("-- OpenCl Enabled")
    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)
    find_package(OpenCL REQUIRED)
    if(NOT OPENCL_FOUND)
        message(FATAL_ERROR "--OpenCl not found! Exiting ...")
    endif()
    set(SRC ${SRC}
        src/polarization_gpu/polar_ocl.c
        src/io/setup_ocl.c)
    set(INCLUDE ${INCLUDE} ${OpenCL_INCLUDE_DIRS})
    set(LIB ${LIB} ${OpenCL_LIBRARIES})
else()
    message("-- OpenCl Disabled")
endif()

if(QM_ROTATION)
    message("-- QM Rotation Enabled")
    set(SRC ${SRC}
        src/quantum_rotation/rotational_basis.c
        src/quantum_rotation/rotational_eigenspectrum.c
        src/quantum_rotation/rotational_integrate.c
        src/quantum_rotation/rotational_potential.c)
    set(LIB ${LIB} lapack)
else()
    message("-- QM Rotation Disabled")
endif()

if(VDW)
    message("-- CDVDW Enabled")
    if(NOT QM_ROTATION)
        set(LIB ${LIB} lapack)
    endif()
else()
    message("-- CDVDW Disabled")
endif()

include_directories(${INCLUDE})
if(CUDA)
    cuda_add_executable(${PROJECT_NAME} ${SRC})
else()
    add_executable(${PROJECT_NAME} ${SRC})
endif()
target_link_libraries(${PROJECT_NAME} ${LIB})

if(MPI)
    if(MPI_C_COMPILE_FLAGS)
      set_target_properties(${PROJECT_NAME} PROPERTIES
        COMPILE_FLAGS "${MPI_C_COMPILE_FLAGS}")
    endif()

    if(MPI_C_LINK_FLAGS)
      set_target_properties(${PROJECT_NAME} PROPERTIES
        LINK_FLAGS "${MPI_C_LINK_FLAGS}")
    endif()
endif()

目录结构为directory_structure

1 个答案:

答案 0 :(得分:3)

您可以从命令行compile将CLion指向构建目录。转到"文件 - >设置 - >建立,执行,...... - > cmake的"并指出"生成路径"你原来的#34;构建目录。否则,CLion会在" cmake-build-debug"中生成自己的目录。即使在将CLion指向另一个目录之后,它仍然可能会根据其他参数更改cmake变量,例如" Debug / Release"在相同的设置选项卡上配置。从您的cmake设置开始,我们可以看到"发布"是默认设置,只需切换即可切换构建目录。