63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
1 | |
Компиляция кода с 2 файлами cpp в разных папках16.08.2019, 19:46. Показов 5878. Ответов 25
Метки нет (Все метки)
Как скомпилировать код если если main.cpp находится отдельно от test.h и test.cpp которые я хочу подключить к main.cpp?
С test.h я разобрался,есть команда -I которая добавляет директорию для поиска заголовочных файлов,но как теперь добавить test.cpp в котором реализация кода с test.h?
0
|
16.08.2019, 19:46 | |
Ответы с готовыми решениями:
25
Возможна ли компиляция одного и того же исходного кода в разных компиляторах? Компиляция .cpp Компиляция файла cpp Компиляция .cpp-файлов из программы |
шКодер самоучка
|
||||||||||||||||
16.08.2019, 20:39 | 2 | |||||||||||||||
Сообщение было отмечено ReYalp как решение
Решение
ReYalp, в консоли как то так
cmake :описываем проект
0
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
16.08.2019, 20:50 [ТС] | 3 |
Max Dark,
Вот тут пожалуйста подробнее,я новенький в Линукс так что возможно очевидных вещей не понимаю,формат .o это что за формат?
0
|
шКодер самоучка
|
||||||
16.08.2019, 21:07 | 4 | |||||
Object file
расширение с форматом связано слабо - оно просто часть имени файла и может быть любым тут главное ключ -c :
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
|
шКодер самоучка
|
||||||
16.08.2019, 22:40 | 6 | |||||
все функции должны быть преобразованы в машинный код.
Упрощенно компиляция состоит из двух этапов
Так вот команды g++ -c -I ..... выполняют этапы [1.a - 1.c] .последняя команда производит компоновку в принципе, эти 3 команды можно объединить в одну:
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
|
шКодер самоучка
|
|
16.08.2019, 23:17 | 8 |
Нельзя.
Если образно, то объектные файлы - это "полуфабрикаты", комплекты частично собранных узлов механизма с инструкцией, какие еще детали нужны для полной сборки. Компоновщик собирает готовое изделие(программу) из таких комплектов.
0
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
16.08.2019, 23:25 [ТС] | 9 |
тогда мне не совсем понятны команды -c -o,если -с компилирует и -o компонирует тогда согласно формулировке
у нас выходит исполняемый модуль ,хоть это не так.
Добавлено через 57 секунд в том смысле что к примеру компонирует все в файл test.o
0
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
16.08.2019, 23:34 [ТС] | 11 |
Max Dark,
Вот это интересно,спасибо,теперь все понятно.
А вот если просто вписать g++ test.cpp main.cpp -o test (при условии что все заголовчные и срр файлы находятся в папке проэкта) то получится исполняемый модуль,почему так? почему без -c?
0
|
шКодер самоучка
|
|
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
|
шКодер самоучка
|
|
16.08.2019, 23:46 | 14 |
Если проект маленький, то можно сразу компилировать и компоновать одной командой.
Указание этого параметра позволяет компилировать только изменившиеся файлы, вести компиляцию в несколько процессов. А это помогает при сборке больших проектов на многоядерных системах.
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 и расширения.
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 |
Именно так.
Библиотека должна быть доступна по стандартным путям поиска библиотек. Либо вы можете установить переменную окружения LD_LIBRARY_PATH перед запуском.
0
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
22.08.2019, 22:44 [ТС] | 19 |
0
|
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
|
|
22.08.2019, 23:46 | 20 |
Нет, не точно.
Должна быть библиотека или ссылка на нее с именем libpython3.5m.so , тогда все будет работать.Если такой библиотеки или ссылки нет, то проверьте установлен ли dev пакет для нее: обычно именно dev пакет доставляет в систему подобное. С учетом этого все вышесказанное верно.
0
|
22.08.2019, 23:46 | |
22.08.2019, 23:46 | |
Помогаю со студенческими работами здесь
20
Компиляция стороннего файла *.cpp Компиляция *.cpp компилятором gcc Переименовать файлы в разных папках Что происходит с файлами в папках и тд Вывод содержимого файлов в разных папках Видимость в папках разных программ и документов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |