2017-10-15 178 views
0

我有一個CMake的(大多數是C,有一些C++)項目,其安裝說明如下:如何告訴我的IDE以特定方式編譯我的CMake項目?

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

+0

如果你提供一個'CMakeLists.txt'的例子來重現這個問題,或者甚至連接器錯誤都會有所幫助,這將有所幫助。 –

+0

@CinderBiscuits抱歉。信息添加。 – Luciano

回答

2

您可以從您的命令行編譯點克利翁到構建目錄。轉到「文件 - >設置 - >生成,執行,... - > Cmake」並將「生成路徑」指向您的「原始」生成目錄。否則,CLion會在「cmake-build-debug」中生成自己的目錄。即使在將CLion指向其他目錄之後,它仍然可能會根據其他參數(如「調試/發佈」配置)在同一設置選項卡上更改cmake變量。由於從你的cmake安裝程序中,我們可以看到「Release」是默認的,只是切換可能會產生差異,甚至沒有切換構建目錄。

相關問題