Reputation: 543
I have a CMake (mostly C, with some C++) project whose installation instructions are as follows:
mkdir build
cd build
cmake /*some options*/ ../
make
This works perfectly if I compile from the command-line.
I would like to use an IDE to compile this program so that I may debug it with a graphical debugger. However, when I attempt to compile using the IDE, I get linker errors.
I am unfamiliar with the internal workings of CMake and so am not sure how to achieve the desired behavior. In fact, I'm unsure if this is a CMake question at all; perhaps this is simply a question of IDE configuration. If it helps, the IDE I'm using is JetBrains' CLion.
The CMake file is
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()
And the directory structure is
Upvotes: 1
Views: 286
Reputation: 2243
You can point CLion to the build directory from your command line compile. Go to "File -> Settings -> Build, Execution, ... -> Cmake" and point the "generation path" to your "original" build directory. Otherwise CLion generates its own dir in "cmake-build-debug". Even after pointing CLion to the other dir it might still changes cmake variables depending on other parameters like "Debug/Release" Configuration on the same settings tab. Since from you cmake setup we can see that "Release" is the default, just switching that can potentially make the difference, without even switching the build dir.
Upvotes: 3