Компиляция — Как скомпилировать (два смешанных исходных кода C ++ из разных пакетов в одном исходном коде)

Скажем, у меня есть два независимых .cpp коды в двух разных каталогах: (обратите внимание, что это просто схема моего вопроса).

Вот первый … который может быть успешно скомпилирован в своем собственном каталоге, который имеет свой собственный Makefile

// special libraries to include
#include "acado.h"#include "auxiliary_functions.c"/* -------------------------- */
// Create objects for special classes
ACADOvariables acadoVariables;
ACADOworkspace acadoWorkspace;

int main(){
// perform task A_1
// perform task A_2
// Tasks A_1 and A_2 depend on the specially included headers
return 0;
}

И вот второй … Опять же, этот код может быть успешно скомпилирован в своем собственном каталоге, который имеет свой собственный Makefile

#include <stdio.h>
#include <stdlib.h>
#include "Aria.h"/* -------------------------- */
// Create objects for special classes
ArPose pose;
ArRobot robot;

int main(){
// perform task B_1
// perform task B_2
// Tasks B_1 and B_2 depend on the specially included headers
return 0;
}

Теперь для моих целей мне нужен исходный код вроде …

// special libraries to include from both packages
#include <stdio.h>
#include <stdlib.h>
#include "Aria.h"#include "acado.h"#include "auxiliary_functions.c"/* -------------------------- */
// Create objects for special classes from Part1
ACADOvariables acadoVariables;
ACADOworkspace acadoWorkspace;
/* -------------------------- */
// Create objects for special classes from part2
ArPose pose;
ArRobot robot;
int main(){
// perform task B_1
// perform task A_1 (this task depends on values returned by B_1)
// perform task B_2 (this task depends on values returned by A_1)
// perform task A_2 (this task depends on values returned by B_1)
return 0;
}

Так, как я могу использовать два пакета и два make-файла, которые мне уже нужны, чтобы скомпилировать этот последний кусок кода? … Я попытался поместить содержимое обоих пакетов (файлов и папок) в один каталог с помощью make-файла, который содержит оба содержимого отдельных make-файлов, но не удалось скомпилировать третий сценарий …

Ваша помощь очень ценится …

1

Решение

В текущем сценарии первое, что нужно проверить, — это то, что ваши make-файлы создают исполняемые файлы, а не просто объектные файлы. Похоже на последнее, если вы говорите, что вывод каждого make-файла может выполняться самостоятельно. Если выходные данные действительно являются исполняемым файлом, а не объектным файлом, вы не сможете «связать» эти исполняемые файлы вместе в новый исполняемый файл. Итак, вы хотите убедиться, что выход процесса компиляции для каждого .cpp файл является объектным файлом с .o расширение, и это только не замужем .cpp файл имеет main() функция. Процесс создания объектных файлов, а не исполняемых файлов может быть выполнен с использованием -c вариант с g++,

Как только у вас есть объектные и / или библиотечные файлы, созданные из каждого из .cpp файлы и один .cpp файл с main() Функция точки входа, вы можете связать файлы объекта / библиотеки вместе, чтобы создать окончательный исполняемый файл, используя g++ который затем будет включать в себя функциональность, описанную в каждом из отдельных .cpp файлы.

0

Другие решения

Вы компилируете каждый из пакетов в библиотеку. Это, вероятно, то, что уже делают make-файлы.

Редактировать: Я почему-то пропустил, что оба эти файла содержат main() функция, четко указывающая, что каждый из них скомпилирован в отдельный исполняемый файл. Что ж, вам придется выделить из них код, который вы хотите использовать повторно, и либо включить его в свой проект, либо создать из него библиотеки и связать их.


Старый ответ о том, как связать библиотеку; здесь потребуется гораздо больше:

Чем в вашем собственном пакете вы передаете флаги компилятора:

  • -Ipath_to_the_headers для этапа компиляции, поэтому директивы #include находят заголовки.
  • -Lpath_to_the_.a_FILES для стадии ссылки, чтобы сказать компилятору, где искать библиотеки
  • -lИмя_библиотеки для стадии ссылки, чтобы сообщить компилятору, какие библиотеки использовать

Последний вариант немного странен, если библиотека вызывается libчто-то.aпишешь просто -lчто-то; в Windows с большинством компиляторов, но не с gcc, библиотека будет называться что-то.lib вместо.

0

По вопросам рекламы [email protected]