假设我在两个不同的目录中有两个独立的.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进入单个目录,但是编译第三个脚本不成功...
非常感谢你的帮助......
答案 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
。