C++ 如何编译(一个源代码中来自不同包的两个混合C+;+;源代码)

C++ 如何编译(一个源代码中来自不同包的两个混合C+;+;源代码),c++,compilation,mixed-code,C++,Compilation,Mixed Code,假设我在两个不同的目录中有两个独立的.cpp代码:(请注意,这只是我问题的示意图) 这是第一个。。。可以在自己的目录中成功编译,该目录有自己的Makefile // special libraries to include #include "acado.h" #include "auxiliary_functions.c" /* -------------------------- */ // Create objects for special classes ACADOvar

假设我在两个不同的目录中有两个独立的
.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;
}
#包括
#包括
#包括“Aria.h”
/* -------------------------- */
//为特殊类创建对象
果皮姿势;
机器人;
int main(){
//执行任务B_1
//执行任务B_2
//任务B_1和B_2取决于特别包含的标题
返回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;
}
//要从两个包中包括的特殊库
#包括
#包括
#包括“Aria.h”
#包括“acado.h”
#包括“辅助功能c”
/* -------------------------- */
//从第1部分为特殊类创建对象
阿卡多变量阿卡多变量;
ACADOworkspace ACADOworkspace;
/* -------------------------- */
//从第2部分为特殊类创建对象
果皮姿势;
机器人;
int main(){
//执行任务B_1
//执行任务A_1(此任务取决于B_1返回的值)
//执行任务B_2(此任务取决于A_1返回的值)
//执行任务A_2(此任务取决于B_1返回的值)
返回0;
}
因此,我如何使用这两个包,以及我已经编译的最后一段代码的两个makefile?。。。我试图将两个包的内容(文件和文件夹)放在一个目录中,其中一个makefile包含各个makefiles的两个内容,但编译第三个脚本失败


非常感谢您的帮助……

在您当前的场景中,首先要检查您的makefiles是否正在创建可执行文件,而不仅仅是对象文件。如果您说每个makefile的输出都可以自己运行,那么看起来就像是后者。如果输出确实是一个可执行文件而不是一个对象文件,那么您将无法将这些可执行文件“链接”到一个新的可执行文件中。因此,您需要确保每个
.cpp
文件的编译过程的输出是一个扩展名为
.o
的目标文件,并且只有一个
.cpp
文件具有
main()
函数。创建对象文件而不是可执行文件的过程可以使用
-c
选项和
g++
来完成


一旦使用每个
.cpp
文件创建了对象和/或库文件,并使用
main()
入口点函数创建了单个
.cpp
文件,然后,您可以使用
g++
将对象/库文件链接在一起,创建最终的可执行文件,该文件将包含每个
.cpp
文件中描述的功能。

您将每个包编译到库中。这可能是makefiles已经在做的事情

Edit:我不知何故忽略了这两个文件都包含
main()
函数,这清楚地表明它们各自被编译成单独的可执行文件。好的,您必须将要重用的代码从它们中分离出来,要么将其包含在项目中,要么从中创建库并将它们链接进来


关于如何链接图书馆的老回应;这里还需要更多:

而不是在您自己的包中传递编译器标志:

  • -I
    编译阶段的头的路径,因此#include指令查找头
  • -L
    指向链接阶段的文件的路径,告诉编译器在哪里查找库
  • -l
    libname for link stage告诉编译器要使用哪些库

最后一个选项有点奇怪,因为如果库被称为
lib
something
.a
,那么您只需编写
-l
something;在使用大多数编译器(而不是gcc)的Windows上,库将被称为
.lib

通常,这类工作是通过将两个软件包保留在各自的目录中,为每个组件构建库或对象文件,然后从这些子组件构建“主”组件来完成的。但是如果不知道这两套源代码的详细信息,就很难具体说明。不可能将可执行文件链接到任何东西。只有链接库和对象才能创建可执行文件或共享库,这就是为什么我说不可能的原因。他需要输出目标文件(和/或库),然后将它们链接在一起,并确保只有一个文件具有
main()
入口点。哦,是的,我不知怎么错过了.cpps的每个包含
main()
函数。感谢您的帮助;但是,我不是C++专家,我不知道把这些编译器标志放在哪里。(即,我应该把标志放在哪个文件中)。我也无法想象目录的结构(也就是说,我无法想象我应该把第一个包文件夹和第二个包文件夹放在哪里)。。。我还要告诉你,我正在一个UNIX平台(ubuntu)上工作。。。我可以发布单个包的makefile,如果这有帮助的话。。。再次感谢,非常感谢您的帮助…@user2056096:我第一次不知何故错过了包含
main()
function的文件。这意味着您将面临一些严重的重构。只能有一个
main()
函数,因此您必须从每个项目中提取所需的位。我建议你找一个关于如何编写和编译C++库的教程;它的范围比一个如此复杂的问题更大。