Скажем, у меня есть два независимых .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-файлов, но не удалось скомпилировать третий сценарий …
Ваша помощь очень ценится …
В текущем сценарии первое, что нужно проверить, — это то, что ваши 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
Имя_библиотеки для стадии ссылки, чтобы сообщить компилятору, какие библиотеки использоватьПоследний вариант немного странен, если библиотека вызывается lib
что-то.a
пишешь просто -l
что-то; в Windows с большинством компиляторов, но не с gcc, библиотека будет называться что-то.lib
вместо.