Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
1

Компиляция кода с 2 файлами cpp в разных папках

16.08.2019, 19:46. Показов 5878. Ответов 25
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как скомпилировать код если если main.cpp находится отдельно от test.h и test.cpp которые я хочу подключить к main.cpp?
С test.h я разобрался,есть команда -I которая добавляет директорию для поиска заголовочных файлов,но как теперь добавить test.cpp в котором реализация кода с test.h?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2019, 19:46
Ответы с готовыми решениями:

Возможна ли компиляция одного и того же исходного кода в разных компиляторах?
Будут ли копии одной и той же программы на Си компилироваться в разных компиляторах или потребуется...

Компиляция .cpp
Доброго времени суток, уважаемым форумчанам. Пишет чайник. Я хочу установить скрипт баннерообменной...

Компиляция файла cpp
Ситуация: среды visual studio нет и не будет. Имеется файл с расширением cpp. Как его...

Компиляция .cpp-файлов из программы
Доброго времени суток! Имеется VS 2013 и .cpp файлы. Задача - написать свою программу, которая...

25
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
16.08.2019, 20:39 2
Лучший ответ Сообщение было отмечено ReYalp как решение

Решение

ReYalp, в консоли как то так
Bash
1
2
3
4
5
6
7
8
9
# компилим...
 
# ... test.cpp
g++ -c -I./mod_test mod_test/test.cpp -o build/mod_test/test.o
# ... main.cpp
g++ -c -I./mod_test main.cpp -o build/main.o
 
# собираем объектники в исполняемый файл
g++ build/main.o build/mod_test/test.o -o build/program
а лучше использовать cmake:
описываем проект
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# CMakeLists.txt
# минимальная версия cmake
cmake_minimum_required(VERSION 3.10)
 
# название проекта
project(program)
 
# имя исполняемого файла
set(EXE "program")
 
# список исходников
set(SRC
    "main.cpp"
    "mod_test/test.cpp")
 
# добавить цель сборки: "исполняемый файл" "список исходников"
add_executable($EXE $SRC)
 
# добавим директорию с заголовочными файлами
target_include_directories($EXE
    PUBLIC "mod_test")
сборка проекта
Bash
1
2
3
4
5
6
7
# создать временный каталог(чтобы не мусорить в исходниках)
mkdir build
cd build
# запустить генерацию Makefile
cmake ../
# запустить сборку
make
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
16.08.2019, 20:50  [ТС] 3
Max Dark,
Цитата Сообщение от Max Dark Посмотреть сообщение
g++ -c -I./mod_test mod_test/test.cpp -o build/mod_test/test.o
# ... main.cpp
g++ -c -I./mod_test main.cpp -o build/main.o
Вот тут пожалуйста подробнее,я новенький в Линукс так что возможно очевидных вещей не понимаю,формат .o это что за формат?
0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
16.08.2019, 21:07 4
Цитата Сообщение от ReYalp Посмотреть сообщение
это что за формат?
Object file
расширение с форматом связано слабо - оно просто часть имени файла и может быть любым
тут главное ключ -c:
Bash
1
2
3
4
g++ --help
#...
-c                       Compile and assemble, but do not link
#...
он говорит gcc "только откомпилировать"
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
16.08.2019, 21:27  [ТС] 5
Max Dark, не могли бы Вы пожалуйста объяснить как вообще работает компиляция в этом случае? У меня есть файл test.h с заголовками функций, процедур, переменных и т.д.,в test.cpp у меня имеется реализация всего что в test.h,в main.cpp у меня подключён хедер test.h и используются функции описанные в test.cpp,теперь вопрос
Что делают эти команды?
g++ -c -I./mod_test mod_test/test.cpp -o build/mod_test/test.o
Эта команда компилирует файл test.cpp? Но для чего его компилировать, это же файл который ничего не делает кроме хранения функций.
g++ -c -I./mod_test main.cpp -o build/main.o
Эта команда компилирует файл main.cpp с указанием как в прошлой места где находится test.h но без указания где находится test.cpp,что является тогда результатом действия этой команды?
0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
16.08.2019, 22:40 6
Цитата Сообщение от ReYalp Посмотреть сообщение
это же файл который ничего не делает кроме хранения функций
все функции должны быть преобразованы в машинный код.

Упрощенно компиляция состоит из двух этапов
  1. компиляция исходников(для каждого исходного файла создается объектный, содержащий машинный код функций):
    1. обработка директив препроцессора
      На этом этапе в исходники на место include подставляются заголовочные файлы а так же производится раскрытие define
    2. синтаксический разбор результата
      Код получившийся на первом этапе преобразуется в промежуточное представление(абстрактное синтаксическое дерево - AST) и проверяется на ошибки(все ли переменные и функции объявлены, совпадают ли типы и тд).
    3. преобразование AST в машинный код
      тут по AST строится объектный файл.
      Доступность используемых функций не проверяется.
  2. сборка результата
    тут вступает в работу компоновщик

Так вот команды g++ -c -I ..... выполняют этапы [1.a - 1.c].
последняя команда производит компоновку

в принципе, эти 3 команды можно объединить в одну:
Bash
1
g++ -I./mod_test mod_test/test.cpp main.cpp -o program
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
16.08.2019, 22:57  [ТС] 7
Max Dark, но что является результатом компиляции test.h и test.cpp? полноценная программа?

Добавлено через 1 минуту
Max Dark, тупой вопрос,понял уже

Добавлено через 1 минуту
Max Dark, смотрите,вот есть формулировка "компоновки" взятая с википедии :
Компоновка (программирование) — сборка исполнимого модуля из одного или нескольких объектных модулей.
так вот вопрос. а разве нельзя назвать test.o назвать исполняемым модулем?
0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
16.08.2019, 23:17 8
Цитата Сообщение от ReYalp Посмотреть сообщение
так вот вопрос
Нельзя.
Если образно, то объектные файлы - это "полуфабрикаты", комплекты частично собранных узлов механизма с инструкцией, какие еще детали нужны для полной сборки.
Компоновщик собирает готовое изделие(программу) из таких комплектов.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
16.08.2019, 23:25  [ТС] 9
Цитата Сообщение от Max Dark Посмотреть сообщение
g++ -c -I./mod_test mod_test/test.cpp -o build/mod_test/test.o
# ... main.cpp
g++ -c -I./mod_test main.cpp -o build/main.o
# собираем объектники в исполняемый файл
g++ build/main.o build/mod_test/test.o -o build/program
тогда мне не совсем понятны команды -c -o,если -с компилирует и -o компонирует тогда согласно формулировке
Цитата Сообщение от ReYalp Посмотреть сообщение
сборка исполнимого модуля из одного или нескольких объектных модулей.
у нас выходит исполняемый модуль ,хоть это не так.

Добавлено через 57 секунд
в том смысле что к примеру
Цитата Сообщение от ReYalp Посмотреть сообщение
g++ -c -I./mod_test mod_test/test.cpp -o build/mod_test/test.o
компонирует все в файл test.o
0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
16.08.2019, 23:30 10
ReYalp, параметр -o просто задает имя выходного файла.

Bash
1
gcc --help
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
16.08.2019, 23:34  [ТС] 11
Max Dark,
Цитата Сообщение от Max Dark Посмотреть сообщение
параметр -o просто задает имя выходного файла.
Вот это интересно,спасибо,теперь все понятно.
А вот если просто вписать g++ test.cpp main.cpp -o test
(при условии что все заголовчные и срр файлы находятся в папке проэкта) то получится исполняемый модуль,почему так? почему без -c?
0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
16.08.2019, 23:35 12
ReYalp, вас скорее всего сбивает с толку то, что для компиляции и компоновки вызывается g++
При компоновке "под капотом" происходит вызов ld(GNU linker) с параметрами для сборки программ, написанных на C++
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
16.08.2019, 23:38  [ТС] 13
Max Dark, спасибо Вам больше)
0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
16.08.2019, 23:46 14
Цитата Сообщение от ReYalp Посмотреть сообщение
почему без -c?
Если проект маленький, то можно сразу компилировать и компоновать одной командой.
Указание этого параметра позволяет компилировать только изменившиеся файлы, вести компиляцию в несколько процессов.
А это помогает при сборке больших проектов на многоядерных системах.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
22.08.2019, 19:18  [ТС] 15
Max Dark, здравсвуйте, а как скомпилировать если имеется динамическая библиотека?

Добавлено через 2 минуты
должно быть что-то типа g++ -I ~/projects/c++/headers ~/projects/c++/libs/lib.so ~/projects/c++/cppfiles/main.cpp -o testfile
0
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
22.08.2019, 20:30 16
ReYalp, называйте библиотеку по правилам. lib<name of library>.so, например libtest.so

указывайте путь для поиска библиотеки для линковщика и саму библиотеку с помощью ключей -L и -l соответственно. Библиотека указывается без префикса lib и расширения.
Bash
1
g++ -I~/projects/c++/headers -L~/projects/c++/libs -ltest ~/projects/c++/cppfiles/main.cpp -o testfile
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
22.08.2019, 20:44  [ТС] 17
DrOffset, если есть libpython3.5m.so.1.0 как ее залинковать?

Добавлено через 53 секунды
-L /path -lpython3.5m? что-то не очень

Добавлено через 5 минут
DrOffset, и еще такая штука во время запуска уже скомпилированного файла
libgattlib.so: cannot open shared object file: No such file or directory
где указать путь для поиска этой библиотеки явно при условии что я запускаю так :
./test ?
0
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
22.08.2019, 21:08 18
Цитата Сообщение от ReYalp Посмотреть сообщение
-L /path -lpython3.5m? что-то не очень
Именно так.

Цитата Сообщение от ReYalp Посмотреть сообщение
где указать путь для поиска этой библиотеки явно при условии что я запускаю так :
Библиотека должна быть доступна по стандартным путям поиска библиотек.
Либо вы можете установить переменную окружения LD_LIBRARY_PATH перед запуском.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
22.08.2019, 22:44  [ТС] 19
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
Именно так.
так нет,точно
0
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
22.08.2019, 23:46 20
Цитата Сообщение от ReYalp Посмотреть сообщение
так нет,точно
Нет, не точно.
Должна быть библиотека или ссылка на нее с именем libpython3.5m.so, тогда все будет работать.
Если такой библиотеки или ссылки нет, то проверьте установлен ли dev пакет для нее: обычно именно dev пакет доставляет в систему подобное.
С учетом этого все вышесказанное верно.
0
22.08.2019, 23:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2019, 23:46
Помогаю со студенческими работами здесь

Компиляция стороннего файла *.cpp
public static void ad() { var startInfo = new ProcessStartInfo(&quot;cmd&quot;, &quot;/c cl...

Компиляция *.cpp компилятором gcc
Недавно столкнулся с проблемой отсутствия библиотеки libgcc_s_dw2-1.dll (виртуалка с чистой...

Переименовать файлы в разных папках
Всем добрый вечер. Нужно переименовать файлы находящиеся в разных папках имя Путь...

Что происходит с файлами в папках и тд
Всех приветствую, позавчера начались какие то странные вещи, открываю папку, там все файлы...

Вывод содержимого файлов в разных папках
Допустим у нас есть 3 папки: папка1, папка2, папка3. В этих папках одинаковое кол-во файлов, с...

Видимость в папках разных программ и документов
Вроде ужесто раз все настраивал. Казалось, все давным давно понятно и видно. А нет. Вопрос...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru