Gcc 如何从头文件正确生成对象文件(使用带debian linux机器的I2C板)
我有一些以前为X86体系结构编译的源文件。现在我需要为ARM架构编译它们。当我尝试使用类似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++生成相同的汇编代码,可能是因为它们
代码> 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:制造商:迪奥兰
谢谢:)您不编译头文件,而是编译包含它们的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