Gcc 如何从头文件正确生成对象文件(使用带debian linux机器的I2C板)

Gcc 如何从头文件正确生成对象文件(使用带debian linux机器的I2C板),gcc,driver,header-files,kernel-module,object-files,Gcc,Driver,Header Files,Kernel Module,Object Files,我有一些以前为X86体系结构编译的源文件。现在我需要为ARM架构编译它们。当我尝试使用类似 代码> G++-C-X+C++ Fo.H./Cudio> gcc-c-xcfoo.h 它只给了我一些指示。我相信它不会将我的头文件链接到其他包含的文件。我只得到“节的分解。注释:”。 请注意,它确实会提示我输入其他文件,例如,如果foo包含foo1.h和foo2.h,如果我没有在同一目录中包含foo1和foo2头,编译器将无法工作 另一件我不明白的事情是,gcc和g++生成相同的汇编代码,可能是因为它们

我有一些以前为X86体系结构编译的源文件。现在我需要为ARM架构编译它们。当我尝试使用类似

代码> G++-C-X+C++ Fo.H./Cudio>

gcc-c-xcfoo.h

它只给了我一些指示。我相信它不会将我的头文件链接到其他包含的文件。我只得到“节的分解。注释:”。 请注意,它确实会提示我输入其他文件,例如,如果foo包含foo1.h和foo2.h,如果我没有在同一目录中包含foo1和foo2头,编译器将无法工作

另一件我不明白的事情是,gcc和g++生成相同的汇编代码,可能是因为它们只生成注释部分,它们看起来是一样的

关于我的问题的更多细节: 我使用的是USB-I2C转换板。该板仅支持x86/x64体系结构。我设法访问了源文件并获得了驱动程序设置。现在我需要一起测试一切。为了做到这一点,我需要能够编译一个示例代码。当我想这样做时,它会调用需要在.a扩展中的静态库。我需要创建自己的库。一个文件。为此,我找到了源c文件(.h头)。现在,我需要在编译期间将它们链接在一起,生成对象文件,并最终将它们归档到.a文件中。 谢谢你的帮助

编辑(更新):

快速总结我迄今为止所取得的成就: -我从github repo找到了一个驱动程序。 -我能够制作这个模块 -我还从raspbian源代码编译了一个新的内核(我是为Raspberry PI3做这件事的):

  • 我能够正确加载模块:

    lsmod 所使用的模块大小 spi_diolan_u2c 3247 0 i2c_diolan_u2c 3373 0 双生胶u2c芯4268 2 i2c双生胶u2c,spi双生胶u2c

    lsusb 总线001装置010:ID a257:2014

    dmesg [126.758990]i2c_diolan_u2c:从树模块加载会污染内核。 [126.759241]i2c_-diolan_-u2c:未知符号diolan_-u2c_-传输(错误0) [130.651475]i2c_-diolan_-u2c:未知符号diolan_-u2c_传输(错误0) [154.671532]usbcore:注册的新接口驱动程序diolan-u2c-core [5915.799739]usb 1-1.2:usb断开连接,设备号4 [10591.295014]usb 1-1.2:使用dwc_otg的6号全新全速usb设备 [10591.425984]usb 1-1.2:发现新的usb设备,idVendor=a257,idProduct=2014 [10591.425997]usb 1-1.2:新的usb设备字符串:Mfr=1,Product=2,SerialNumber=0 [10591.426005]usb 1-1.2:产品:迪隆DLN1 [10591.426012]usb 1-1.2:制造商:迪奥兰

我不确定的是: 如果内核空间正确映射到物理硬件(如果加载的模块可以获得我的diolan板)!!! 进展:根据我的研究,我认为热插拔协议可以解决这个问题,但不确定! 困惑:为什么lsusb仍然只显示设备ID。我知道制造商和内核驱动程序可以确定要显示的信息,但仅显示ID对我来说似乎不合适

我现在想做的是: 我想写一个简单的c源代码或python代码来与我的设备交互。基本上我不知道如何在用户空间和内核空间之间建立连接。制造商提供了一些源代码示例、库等。然而,我已经放弃使用它们,因为它们是用于另一种基于qt的体系结构,我发现几乎不可能找到它们在静态库中使用的库的替代品(我通过恢复它们的.a存档文件来计算这些库,该文件是为x86提供的)

我只需要知道我下一步应该做什么,让董事会和PI一起工作。
谢谢:)

您不编译头文件,而是编译包含它们的C文件


头文件中的所有代码都应该是声明和类型定义,它们向编译器提供信息,但实际上不生成任何机器代码。这就是为什么您的对象文件中没有任何内容。

您不编译头文件,而是编译包含它们的C文件


头文件中的所有代码都应该是声明和类型定义,它们向编译器提供信息,但实际上不生成任何机器代码。这就是为什么您的对象文件中没有任何内容。

您不从头文件中生成任何内容。Linux上的对象文件(和可执行文件)是文件。使用(或…)检查

相反,头文件应该包含在一些
*.cc
文件中(从技术上讲是一个文件)

(您可以预编译头,但这只对缩短编译时间有用,但并不总是这样,而且是一种高级的特定于GCC的用法;请参阅)

<>你将一个C++源文件(一些<代码> *.cc>代码>文件)编译成一个被后缀的代码> > o>代码>(或C源文件<代码> *.c/c>编译成一个对象文件,后缀<代码> .o>代码>

<>阅读更多有关的内容,并花几天时间阅读C或C++(这是不同的编程语言)。还可以阅读有关编译和链接的更多信息

<>我建议编译你的C++代码,使用代码> g++-Walth-Wop-g < /C> >以获取所有警告(使用<代码> -WalthWOT/COD>)和调试信息(使用<代码> -G <代码> >

编译C++中的一些<代码>文件>文件>代码>文件>代码>

g++ -c -Wall -Wextra -g yourfile.cc
(您可以删除
-Wall-Wextra-g
,但我强烈建议保留它们)

您可能需要将其他参数添加到
g++
。他们点了很多东西。阅读关于

请注意,
yourfile.cc
很可能包含一些(通常是几个)include指令(通常在其开始处)

你很少需要它
g++ -c -Wall -Wextra -g yourfile.cc