1

假设我.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,但是编译第三个脚本并不成功...

非常感谢您的帮助...

4

2 回答 2

0

在您当前的情况下,首先要检查的是您的 makefile 是否正在创建可执行文件而不是简单的目标文件。如果您说每个 makefile 的输出都可以自己运行,则似乎是后者。如果输出确实是可执行文件而不是目标文件,那么您将无法将这些可执行文件“链接”在一起成为新的可执行文件。所以你要确保的是每个.cpp文件的编译过程的输出是一个带有.o扩展名的目标文件,并且只有一个文件 .cpp有一个main()函数。创建目标文件而不是可执行文件的过程可以使用-c选项 with来完成g++

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

于 2013-02-11T15:16:49.433 回答
0

您将每个包编译成一个库。这可能是makefiles已经做的。

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


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

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

  • -Ipath_to_the_headers用于编译阶段,因此 #include 指令会找到标头。
  • -L链接阶段的path_to_the_files.a告诉编译器在哪里寻找库
  • -l链接阶段的libname告诉编译器使用哪些库

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

于 2013-02-11T15:18:00.427 回答