C程序-无法一起编译文件

C程序-无法一起编译文件,c,file,compiler-construction,linker,C,File,Compiler Construction,Linker,我有几个文件无法一起编译。也许我试图编译它们的方式是错误的。但我就是不能让他们一起工作。 我已经尝试了几个不同的更改,但还没有弄清楚是什么导致它们不能一起编译 我正在使用Windows和Microsoft Visual Studio以及开发人员命令提示符作为编译器 我还没有尝试将几个文件编译在一起。 对于defs.h文件,我得到一个LNK1107:无效或损坏的文件:在0x3E7处无法读取错误 对于pack.c和unpack.c,它有一个语法错误,即第15行中缺少标识符unpack以及分号和结束括

我有几个文件无法一起编译。也许我试图编译它们的方式是错误的。但我就是不能让他们一起工作。 我已经尝试了几个不同的更改,但还没有弄清楚是什么导致它们不能一起编译

我正在使用Windows和Microsoft Visual Studio以及开发人员命令提示符作为编译器

我还没有尝试将几个文件编译在一起。 对于defs.h文件,我得到一个LNK1107:无效或损坏的文件:在0x3E7处无法读取错误

对于pack.c和unpack.c,它有一个语法错误,即第15行中缺少标识符unpack以及分号和结束括号,第23行中也有相同的错误,但标识符pack没有

我认为对于打包和解包文件,鉴于我在defs.h文件中使用了typedef,它不应该有标识符问题

defs.h 包装c 拆包
我认为您遇到了麻烦,因为packed是一个属性,它可以应用于结构,以指示它们应该在结构元素之间无填充地存储。这或多或少与您指示的错误消息一致

要证明或反驳这一理论,请将packed重命名为其他名称,例如packed,然后看看这是否有帮助。在defs.h和packed.c中进行。如果错误消息的更改不仅仅是由于重命名操作造成的,那么它会有所帮助。如果邮件上说的是之前打包过的东西,然后说是打包过的,那就没用了。如果错误消息发生了实质性的变化或根本不存在,那么packed关键字就是问题所在

在GCC中,您需要使用一种表示法,例如获取压缩结构;你不能偶然使用它

请注意,您通常不编译头;编译使用头的源文件。不清楚为什么要尝试链接到标题。可以链接对象文件和库

我可以确认您的defs.h文件在Mac OS X 10.9.2和GCC 4.8.2上编译干净。我有一个脚本,它在头上执行检查编译,以测试自给自足性和幂等性。实际上,它创建了一个源文件,例如x3981f.c,在本例中包含:

#include "defs.h"   // Self-sufficiency
#include "defs.h"   // Idempotency
int main(void) { return 0; }  // Non-empty file
它编译时不会出现错误或警告:

gcc -c -Wall -Wextra x3981f.c
pack.c源文件需要include,并且两个源文件都需要添加include。但是,通过这些添加,代码可以使用这些更严格的编译选项进行干净的编译:

$ gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
>     -Wold-style-definition -Werror -c pack.c
$ gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
>     -Wold-style-definition -Werror -c unpack.c
$
这几乎让我相信,你的问题在于你的名字


OTOH,表明您需要使用pragma pack2来打包结构。这也不是偶然使用的。尽管如此,如果包含缺少的头文件,您显示的代码在Unix系统上编译得很干净。如果它不能在MSVC中干净地编译,那么问题是在MSVC环境中固有的,而不是在一般的C语言中。

您没有提到任何实际问题。想象一下如果有人来找你说我的车坏了。仅基于该语句,您能为它们提供多少帮助?不能将它们编译在一起是什么意思?命令行?您可能应该确定正在使用的环境o/s和编译器。您当然应该展示如何编译它们。您应该显示来自编译器的前几条错误消息。表面上看,您可能会在类似Unix的机器上编写cc-c packet.c unpacket.c,并期望将packet.o和unpacket.o作为对象文件,稍后可以链接到带有主函数的程序中。
#include "defs.h"   // Self-sufficiency
#include "defs.h"   // Idempotency
int main(void) { return 0; }  // Non-empty file
gcc -c -Wall -Wextra x3981f.c
$ gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
>     -Wold-style-definition -Werror -c pack.c
$ gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
>     -Wold-style-definition -Werror -c unpack.c
$