Как скомпилировать (два смешанных исходных кода на 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-файлов, но не удалось скомпилировать третий сценарий...

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

2 ответа

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

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

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

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


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

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

  • -I path_to_the_headers для этапа компиляции, поэтому директивы #include находят заголовки.
  • -L path_to_the_ .a _files для стадии ссылки, чтобы сообщить компилятору, где искать библиотеки
  • -l libname для стадии ссылки, чтобы сообщить компилятору, какие библиотеки использовать

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

Другие вопросы по тегам