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

时间:2013-02-11 15:11:33

标签: c++ compilation mixed-code

假设我在两个不同的目录中有两个独立的.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;
}

所以,我如何使用这两个包,以及我已经编译过最后一段代码的两个makefile? ...我试图把两个包内容(文件和文件夹) )使用包含单个makefile的内容的makefile进入单个目录,但是编译第三个脚本不成功...

非常感谢你的帮助......

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您将每个包编译为库。 这可能就是makefile已经做的。

编辑:我错过了这两个文件都包含main()函数,清楚地表明它们都被编译成单独的可执行文件。好吧,您必须将要重用的代码考虑在内,并将其包含在项目中,或者从中创建库并将它们链接起来。


关于如何链接库的旧回应;这里还需要更多:

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

  • -I path_to_the_headers 用于编译阶段,因此#include指令可以找到标题。
  • -L path_to_the _ .a _ files 链接阶段告诉编译器在哪里查找库
  • -l libname 用于链接阶段告诉编译器使用哪些库

最后一个选项有点奇怪,如果库被称为lib 某事 .a,你只需写-l 某事;在大多数编译器的Windows上,但不是gcc,库将被称为某种东西 .lib