代码之家  ›  专栏  ›  技术社区  ›  Luciano

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

  •  1
  • Luciano  · 技术社区  · 7 年前

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

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

    我想使用IDE来编译这个程序,这样我可以用图形调试器来调试它。然而,当我尝试使用IDE编译时,会出现链接器错误。

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

    IDE_error

    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 回复  |  直到 7 年前
        1
  •  3
  •   renefritze    7 年前

    您可以从命令行编译中将CLion指向build目录。转到“文件->设置->生成,执行,…->Cmake”,并将“生成路径”指向“原始”生成目录。否则,CLion会在“cmake build debug”中生成自己的dir。即使将CLion指向另一个目录,它仍然可能会根据其他参数(如同一设置选项卡上的“调试/释放”配置)更改cmake变量。因为从您的cmake设置中,我们可以看到“Release”是默认值,只需切换它就可能产生影响,甚至不需要切换build dir。