C++ 链接Arduino IDE中的预构建对象

C++ 链接Arduino IDE中的预构建对象,c++,compiler-construction,arduino,C++,Compiler Construction,Arduino,我正试图编译一个arduino程序 我想已经编译了一些文件,除了草图。我已经修改了arduino IDE以编译未编译的文件,但我需要所有文件的.h文件 是否可以在CPP中编译一个文件,其他文件在.o中,而不在.h中 我不想让任何人看到我的文件或代码,包括.h 如果可能的话,我会开始检查ARDUNO代码,看看如何修改它,但是如果不是,我必须寻找另一种方法来做。 < P> ARDINO使用C++,编译的C++函数名被修改成包含对象(.0)文件中的参数类型。要使用兼容名称mangling编译用户代码,

我正试图编译一个arduino程序

我想已经编译了一些文件,除了草图。我已经修改了arduino IDE以编译未编译的文件,但我需要所有文件的.h文件

是否可以在CPP中编译一个文件,其他文件在.o中,而不在.h中

我不想让任何人看到我的文件或代码,包括.h


<>如果可能的话,我会开始检查ARDUNO代码,看看如何修改它,但是如果不是,我必须寻找另一种方法来做。

< P> ARDINO使用C++,编译的C++函数名被修改成包含对象(.0)文件中的参数类型。要使用兼容名称mangling编译用户代码,唯一的方法是在编译时进行完整的函数声明

因此,您必须至少提供一个头文件,其中包含用户将调用的任何函数的完整函数声明。这不可能是秘密,这是你的API,如果你不告诉用户,用户就不能使用它

公共头文件中不需要包含内部私有函数或数据类型的声明或定义


因此,创建一个
library\u public.h
文件,其中只包含用户应该知道的声明,并将其与.o文件一起提供。然后创建一个
库\u private.h
,里面有你所有的秘密资料。你的私有源代码将包含两个.< /p> ARDUNO使用C++,编译的C++函数名被修改为包含对象(.o)文件中的参数类型。要使用兼容名称mangling编译用户代码,唯一的方法是在编译时进行完整的函数声明

因此,您必须至少提供一个头文件,其中包含用户将调用的任何函数的完整函数声明。这不可能是秘密,这是你的API,如果你不告诉用户,用户就不能使用它

公共头文件中不需要包含内部私有函数或数据类型的声明或定义


因此,创建一个
library\u public.h
文件,其中只包含用户应该知道的声明,并将其与.o文件一起提供。然后创建一个
库\u private.h
,里面有你所有的秘密资料。您的私有源代码将包括这两个部分。

理论上,您可以将您的目标文件与已经存在的文件链接起来。但是,即使没有头文件,
.cpp
文件也不知道对象文件中的任何内容。那么,提供这样一个无形的图书馆有什么意义呢?!编辑标题以反映您要做的是链接已编译的文件。将Arduino作为目标(例如使用Makefile构建),这绝对是可能的(如果您提供一个仅包含函数原型的头文件等),但是让IDE来完成这项工作可能很棘手-IDE似乎是为了鼓励开源和用户可改进的库。@ChrisStratton当然是可能的。但是新编译的
.cpp
在目标文件中没有定义这些标识符,因此无法使用它们(可能仍然可以使用难看的指针)…就编译器而言,源文件中的外部引用当然是未定义的,并且在其输出的目标文件中仍然如此。需要解决这些问题的是链接器。所有编译器需要的是适当的函数原型、全局声明、typedef等。我想让一个程序在草图中运行,这就是拥有一个不可见库的意义所在。我将尝试在命令行和导出到ArduinoIDE后进行一些测试。我知道它是为开源而开发的,它需要很多修改。理论上,你可以把你的目标文件和那些已经存在的链接起来。但是,即使没有头文件,
.cpp
文件也不知道对象文件中的任何内容。那么,提供这样一个无形的图书馆有什么意义呢?!编辑标题以反映您要做的是链接已编译的文件。将Arduino作为目标(例如使用Makefile构建),这绝对是可能的(如果您提供一个仅包含函数原型的头文件等),但是让IDE来完成这项工作可能很棘手-IDE似乎是为了鼓励开源和用户可改进的库。@ChrisStratton当然是可能的。但是新编译的
.cpp
在目标文件中没有定义这些标识符,因此无法使用它们(可能仍然可以使用难看的指针)…就编译器而言,源文件中的外部引用当然是未定义的,并且在其输出的目标文件中仍然如此。需要解决这些问题的是链接器。所有编译器需要的是适当的函数原型、全局声明、typedef等。我想让一个程序在草图中运行,这就是拥有一个不可见库的意义所在。我将尝试在命令行和导出到ArduinoIDE后进行一些测试。我知道它是为开源而开发的,需要很多修改。谢谢你的解释。我会这样做的,这只是与此相关的另一个问题。我在“secret”文件中有一些函数,这些函数被“public”函数调用。我可以把秘密的也包括在图书馆吗?谢谢你的解释。我会这样做的,这只是与此相关的另一个问题。我在“secret”文件中有一些函数,这些函数被“public”函数调用。我能把秘密的也包括在图书馆吗?