Как запускать C++ файлы без конфликтов в Clion
Я скачал Clion недавно. Я создал два .cpp файла с простым кодом (оба кода работают по отдельности верно). Но проблема в том что Clion не может просто так компилировать несколько файлов которые используют main (я имею ввиду если написать в обоих файлах int main() <. . .>и int main() <. . .>то при компиляции любого из этих файлов выдаст ошибку). Как это исправить? Ошибка:
duplicate symbol '_main' in: CMakeFiles/CodeForces.dir/158A.cpp.o CMakeFiles/CodeForces.dir/4A.cpp.o ld: 1 duplicate symbol for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
Отслеживать
задан 6 мар 2022 в 16:10
user18279824 user18279824
создавайте отдельные проекты. Они для этого и предназначены. А просто «запустить файл» — так оно не умеет. Хотите «запускать» каждый файл по отдельности — делайте это с консоли.
6 мар 2022 в 16:23
Точка входа в приложение main в каждом исполняемом файле должна быть только одна. Соответственно вам следует для каждого файла создать цель — исполняемый файл посредством add_executable .
Как правильно собирать проект в clion?

Clion работает нормально и запускает приложения в режиме отладки без проблем. Также, он создаёт файл типа «Разделяемая библиотека», который запускается из терминала, но не запускается по клику и выдаёт ошибку:
Код Cmake:
cmake_minimum_required(VERSION 3.17) project(test4) set(CMAKE_CXX_STANDARD 14) add_executable(test4 main.cpp)
Так вот — как сформировать exe/elf файл, который будет запускаться без посторнних средств?
- Вопрос задан более двух лет назад
- 515 просмотров
Что это и зачем нужно
CMake — кроссплатформенная автоматизированная система сборки проектов. Непосредственно сборкой она не занимается, а только генерирует Makefile, который потом будет выполнен утилитой make.
CMake может проверять наличие необходимых библиотек и подключать их, собирать проекты под разными компиляторами и операционными системами. Т.е. у вас есть куча кода и файлик, содержащий информацию для cmake, и чтобы скомпилить это дело где-нибудь еще, вам нужно просто запустить там cmake, который сделает всё сам. Удобно, полезно, просто.
Краткое описание
Если нет желания/времени/сил читать весь туториал и Вы используете какой-нибудь QtCreator (или любая другая IDE, умеющая работать с cmake), то:
- Создайте в IDE проект под cmake
- Найдите в папке с проектом CMakeFiles.txt
- Пробегитесь глазами по туториалу, соотнося его с вашим CMakeFiles.txt
Про подключение библиотек рекомендуется все-таки прочитать целиком.
Старт
Предполагается, что найти и скачать сам cmake ты, %username%, в состоянии. //а если нет?
Предположим, у Вас есть исходничек «test.cpp» (// а если нет?)(А если нет, то CMake тебе трогать рано). Для начала нужно создать файлик для cmake, который обычно называют «CMakeLists.txt», и написать туда вот это:
add_executable(test test.cpp)
Теперь запускаем (из консоли) в этой папке команду «cmake CMakeLists.txt» (аргументом можно передавать не только файл, но и директорию, в которой он лежит, тогда cmake найдет его сам).
cmake будет использовать переданный (или найденный) файл проекта (тот самый CMakeLists.txt), и в текущей директории будет создавать проект. Проект — это много-много файлов и директорий (примечание: поэтому лучше запускать cmake из другой директории, чтобы можно было, например, быстро удалить все бинарники), из которых нас больше всего интересует Makefile.
Makefile — это файл, нужный для утилиты make. Именно она запускает компиляторы, линковщики и прочие радости. Запускаем make в каталоге сборки (т.е. там же, где Вы запускали cmake). В консоли вылезет примерно такой текст:
Scanning dependencies of target test [100%] Building CXX object CMakeFiles/test.dir/test.cpp.o Linking CXX executable test [100%] Built target test
А у Вас в папочке появится исполняемый файл «test». Запустите, убедитесь, что это действительно то, что ожидается от компиляции файла «test.cpp».
Подробное описание
Поразбираемся с различными возможностями cmake.
Указание необходимой версии cmake
cmake_minimum_required(VERSION 2.6)
Указывайте высокую минимальную версию CMake. Если используемая версия cmake меньше 2.6, он не захочет работать. Писать эту команду всегда — хороший стиль (cmake будет пыхтеть и обижаться, если вы не укажете версию, но собирать всё равно всё будет).
Название проекта
project(visualization)
Указывает, что этот cmake-файл является корневым для некоторого проекта. С проектами связаны определенные переменные и поведение cmake (читайте документацию).
Переменные
В cmake можно создавать текстовые переменные. Команда
set(VARIABLE The variable's value)
запишет в переменную «VARIABLE» значение «The variable’s value». Чтобы где-либо использовать значение этой переменной, нужно написать $.
Чтобы добавить к переменной некий текст, можно сделать так:
set(VARIABLE "$ new text")
Как видите, использовать значение можно и внутри кавычек. Переменные активно используются различными библиотеками — для установки флагов, параметров сборки/линковки и прочих вкусностей, об этом чуть-чуть попозже.
Пример коше’гного проекта со списком сорцов в отдельной переменной:
cmake_minimum_required(VERSION 2.6) set(SOURCES test.cpp lib1.cpp lib2.cpp) add_executable(test $)
Устанавливаем команды компилятору
add_definitions(-DSOME_IMPORTANT_DEFINITION)
Эта команда используется для установки дефайнов, которыe можно проверить в коде через, например, #ifdef SOME_IMPORTANT_DEFINITION.
set(CMAKE_CXX_FLAGS "$ -std=c++11 -Wall")
Эта команда добавит к флагам, используемым при сборке c++-кода, флаги -std=c++11 и -Wall.
Кто не знает: «-std=c++11» включает в gcc поддержку стандарта c++11, «-Wall» говорит gcc выводить все предупреждения (очень советую, помогает отловить много глупых багов и писать аккуратный код).
Если ваша версия GCC меньше, чем 4.7.0, вместо -std=c++11 нужно использовать -std=c++0x.
В GCC 4.8.0 появился флаг -std=c++1y, в котором начинают реализовывать фичи следующего стандарта.
Папка с хедерами
Допустим, Вы хотите, чтобы хедеры (файлики, подключаемые через #include) искались еще и в каталогах «headers/» и «more_headers/»:
include_directories("headers/" "more_headers/")
Надеюсь, и это понятно.
Самое важное — подключение библиотек
Научимся искать и подключать библиотеки при помощи cmake на примере Boost. Для начала установим переменные для буста:
set(Boost_USE_STATIC_LIBS OFF) set(Boost_USE_MULTITHREADED ON)
Первое — мы не хотим, чтобы буст подключался к нам статически (т.е. хотим динамическую линковку). Если ты, %username%, не знаешь, что это, пока просто забей и используй этот флаг так, как написано. Но в ближайшее время узнай, о чем речь. Второй флаг разрешает бусту внутри своих магических реализаций использовать треды для распараллеливания и прочих радостей.
Итак, мы установили флаги. Давайте найдем буст!
Допустим, нам нужны компоненты буста под названием chrono (библиотека для работы со временем) и filesystem (библиотека для работы с файловой системой):
find_package(Boost COMPONENTS chrono filesystem REQUIRED)
Win, будут искаться только нужные библиотеки, и их расположение будет записано в переменную Boost_LIBRARIES.
Опция «REQUIRED» говорит о том, что библиотека необходима проекту. Без нее cmake решит, что отсутствие данной библиотеки — не так уж и страшно, и будет собирать дальше.
Добавим директории с хедерами буста для поиска в них хедеров:
include_directories($)
Итак, осталось найденные библиотеки подключить к исполняемому файлу.
target_link_libraries(test $)
В качестве библиотек нужно указать пути к необходимым собранным библиотекам. cmake нашел указанные нами библиотеки и записал в переменную, чем мы и пользуемся.
Заметим, что эту команду нужно вызывать после того, как создан target сборки (через add_executable).
Пример хорошего CMakeLists.txt и где он будет лежать
Итак, полный пример использования всего этого. У нас есть некая директория (отныне считаем ее «/sources»), и в ней лежат исходники
/sources/lib1/main.cpp /sources/lib2/main.cpp /sources/main.cpp
В корне «/» лежит файл «/CMakeLists.txt»:
cmake_minimum_required(VERSION 2.8) project(cmake-example) set(Boost_USE_STATIC_LIBS OFF) set(Boost_USE_MULTITHREADED ON) find_package(Boost COMPONENTS chrono filesystem REQUIRED) set(CMAKE_CXX_FLAGS "$\$$ -std=c++11 -Wall") set(SRC_LIST lib1/main.cpp lib2/main.cpp main.cpp) add_executable($\$$ $\$$) target_link_libraries($\$$ $\$$)
Если Вам что-то в нём не понятно — перечитайте соответствующую информацию выше.
Создаем директорию «/build» (не «/sources/build»), переходим в нее, запускаем в ней «cmake ..». «..» — метка родительской директории. cmake возьмет из нее наш CMakeLists.txt и по нему создаст проект в папке «/build». Чтобы проект собрать, запускаем «make» в той же папке «/build».
Таким образом, в корне у нас есть:
- CMakeLists.txt
- директория с исходниками
- каталог сборки
Все разделено, автоматизировано и удобно.
Как создать библиотеку в поддиректории и слинковать ее с основной программой
Пусть в ./ лежит основной проект, а в ./subdir мы хотим сделать либу, а в ./build построить проект.
project(MegaLibrary) set(SOURCES lib.cpp) set(HEADERS lib.h) add_library(lib $\$$ $\$$) target_include_directories(lib PUBLIC $\$$)
project(MainProject) set(MAIN_PROJECT_SRC_LIST main) # Other stuff
add_executable(main $\$$) add_subdirectory(subdir) target_link_libraries(main lib)
Теперь можно в файлах основного проекта делать #include «lib.h» (см. документацию по target_include_directories).
В ./build запускаем «cmake .. && make» и получаем собранный проект.
Как использовать CMake в связке с QtCreator
Интеграция с cmake у QtCreator не очень тесная, тем не менее, работать с ним можно.
Создаем новый проект без использования Qt, выбираем «Проект на С++ с использованием CMake». Создастся дефолтный файл сборки, который просто добавляет все исходники в директории проекта и компилирует их в один бинарник.
Как добавить header в проект, чтобы его было видно в списке файлов
Если вы создали файл header.h в директорию проекта, просто строчку
add_executable($\$$ $\$$)
add_executable($\$$ $\$$ "header.h")
Как настроить CLion актуальной версии для запуска и компиляции
При кодировании C L ion позволяет ва м вообще забыть о рутине. Компилятор и отладка кода в C L ion просто на высоте. Вы можете четко сконцентрироваться только на важном, а все остальное этот редактор возьмет на себя. Данная IDE способна повысить в ашу производительность за счет «умного» и своевременного автозавершения кода, мгновенной навигации по документу и надежного рефакторинга.
Преимущества C L ion перед другими IDE
- Легкий старт. В данной IDE очень легко начать новый проект , ф айлы могут быть добавлены в проект одним щелчком мыши.
- Умный редактор. Благодаря своей умной среде, C L ion анализирует ваш код, понимает ваш проект и старается увеличить вашу скорость написания кода за счет интеллектуального автозавершения.
- Навигация и поиск. Найти необходимый «кусок» кода не составит труда — мгновенная навигация по символу, классу или файлу в этом помогает.
- Генерация кода и рефакторинг. C L ion экономит вам время за счет генерации кода — от геттеров/сеттеров до более сложных шаблонов.
- Анализ кода на лету. У вас есть возможность писать красивый и правильный код. Данная IDE «на лету» проводит статический анализ вашего кода для поддерживаемых языков , п оэтому она способна сразу показывать вам предупреждения и ошибки.
- Настройка редактора. Гибкая система настройки C L ion позволяет выбирать тему редактора, раскладку клавиатуры и др. В общем , позволяет вам полностью настроить C L ion под себя.
- Запуск и отладка C L ion. Вы можете запускать и отлаживать свою программу как локально, так и удаленно.
- Динамический анализ. Если использовать интеграцию с Valgrid Memcheck, Google Sanitizerz и CPU Profiler, то можно легко обнаружить ошибки в памяти, скачки данных и любую другую проблему, также можно с легкостью отслеживать производительность вашей программы.
- Поддержка CMake. CMake — это кроссплатформенная система сборки, которая широко используется для проектов С и С++.
- Модульное тестирование. CLion поддерживает платформы Google Test, Boost.Test и Catch. Также он имеет встроенный инструмент для запуска тестов.
- Документация по коду. В CLion легко документировать свой код. Доступен предварительный просмотр документов в стиле Doxygen во всплывающем окне.
- Встроенная разработка. В CLion вы легко можете разрабатывать для микроконтроллеров, используя различные возможности отладки.
- Интеграция VCS. Данная IDE предоставляет унифицированный интерфей с для большинства популярных VCS, таких как Git, GitHub, CVS, Perforce и другие.
- Удобный терминал. Вы легко можете получить доступ к командной строке через встроенный терминал, можете включить режим эмуляции Vim, можете расширить функциональность среды и другими плагинами.
Как настроить IDE CLion?
- Тема редактора. В настройках редактора есть возможность выбрать между светлой и темной темой оформления. Разработчикам с дальтонизмом можно попробовать параметр «Корректировать цвета красно-зеленого дефицита».
- Цвета и шрифты. Не стесняйтесь использовать настройки на полную. Вы свободно можете настроить макет цветов , шрифтов и синтаксиса, выделения ошибок, отладчика и т.д. Можете использовать предустановленные схемы цветов или созда ть с нуля сво и .
- Комбинации клавиш. IDE CLion по умолчанию предоставляет комбинации клавиш почти для каждой функции. Вы можете выбрать из списка подготовленных схем комбинаций или создать сво и .
- Фон редактора. Вы можете оживить редактор этой рабочей среды, установив любое фоновое изображение.
- Лигатуры. Если вам нравятся шрифты с лигатурами — используйте их.
- Семантическое выделение. Возможно , вам будет полезным способность настроить выделение каждой переменной или параметра своим цветом.
Запуск и отладка CLion
В зависимости от цели вашего проекта (CMake, Makefile, Gradle) CLion будет генерировать необходимую конфигурацию, которую можно будет запустить.
Запуск CLion
- Шаблоны конфигурации. Чтобы сократить время, вы можете использовать шаблоны конфигурации для модульного тестирования, удаленной отладки, запуска обычного приложения и т.д.
- Конфигурация запуска. Вы можете изменять исполняемый файл любой конфигурации. При желании можете сделать конфигурацию «не рабочей».
- Конфигурация отладки. Для старта отладки нужно нажать «Shift+F9». Чтобы проверить состояние отладки , CLion предоставляет много полезных ярлыков.
Отладка CLion
- Присоединение к локальному процессу. CLion позволяет отлаживать процессы на локальном компьютере, запускаемые на самом ПК, а не через IDE.
- Удаленная отладка GDB. Если у вас есть один запущенный исполняемый файл на локальном ПК под gdbserver, вы можете подключиться к нему с другого компьютера при помощи GDB из CLion.
- Контрольные точки. При старте отладки данная IDE может проверить выполнение вашего кода. Вы можете выбрать из нескольких точек останова (точки останова на стоке, символические точки останова, точки останова на исключение).
- Точки выполнения. С помощью действия Set Execution Point to Cursor вы можете перемещаться вперед/назад в процессе выполнения отладки, вы можете прерывать или перезапускать циклы и др.
- Отладка root. CLion может запускать и отлаживать вашу программу с правами root, если вы выберете эту опцию.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.