我有几个无法一起编译的文件。可能是我试图编译它们的方式也许是错误的。但是我只是不能让他们一起工作。
我尝试了几种不同的更改,但还没有弄清楚是什么导致它们无法一起编译。
我将Windows和Microsoft Visual Studio以及开发人员命令提示符用作编译器。
我仍然对尝试将多个文件一起编译还是陌生的。
对于defs.h
文件,我得到一个LNK1107:invalid or corrupt file: cannot read at 0x3E7 error
。
对于pack.c
和unpack.c
,它有一个语法错误,说在第15行中缺少标识符unpack
以及分号和结尾括号,在第23行中也出现了相同的错误,但使用标识符pack
我考虑过打包和解压缩文件,因为我在typedef
文件中使用defs.h
,所以它不应该存在标识符问题。
defs.h
#ifndef DEFS_H
#define DEFS_H
// a structure that contains field widths
typedef struct {
int * fieldWidths; // a pointer to an array of bit field widths (in bits)
int numWidths; // the number of elements in the array (i.e., the number of bit fields)
} sizes;
// a structure that contains an array of ints containing packed data fields
typedef struct {
int * fieldValues; // a pointer to an array of ints containing packed bit fields
int n; // the number of elements in the array
} packed;
// a structure that contains an array of ints containing individual data values (one per int)
typedef struct {
int * values; // a pointer to an array of ints containing values for bit fields (one per element)
int n; // the number of elements in the array
} unpacked;
packed pack(sizes s, unpacked un);
unpacked unpack(sizes s, packed p);
#endif
包
#include "defs.h"
//The below #define is used to extract bits
//Usage: GETMASK(7, 3) returns value = 00000000_00000000_00000000_11111000
//Usage: GETMASK(7, 0) returns value = 00000000_00000000_00000000_11111111
#define GETMASK(lastbit, firstbit) ( (0xffffffff<<(firstbit)) & (0xffffffff>>(32- (lastbit)-1) ) )
/*
* Pack values into bit fields.
*
* Parameters:
* s - The bit field widths.
* un - The unpacked values.
*
* Returns - packed values.
*/
packed pack(sizes s, unpacked un){
packed p;
int i=0, totalWidth=0, x=0;
int shift;
// Calculating the max number of ints needed to store values
for( i=0; i<s.numWidths; i++){
totalWidth+=s.fieldWidths[i];
p.n = ceil( totalWidth/32.0 );
p.fieldValues = (int*)malloc( sizeof(int)*p.n );
for( i=0; i<p.n; i++)
p.fieldValues[i]=0;
}
shift=32;
for( i=0; i<s.numWidths; i++){
shift -= s.fieldWidths[i];
if( shift < 0 ){
int upperbits = s.fieldWidths[i] + shift;
int part1 = un.values[i] & GETMASK(s.fieldWidths[i]-1, s.fieldWidths[i]-upperbits);
int part2 = un.values[i] & GETMASK(s.fieldWidths[i]-upperbits-1, 0);
p.fieldValues[x++] |= part1;
shift += 32;
p.fieldValues [x] |= (part2 << shift);
continue;
}
p.fieldValues[x] |= (un.values[i] & GETMASK(s.fieldWidths[i]-1, 0)) << shift;
}
return p;
} // end of pack function
解压
#include "defs.h"
/*
* Unpack values from bit fields.
*
* Parameters:
* s - The bit field widths.
* p - The packed values.
*
* Returns - unpacked values.
*/
unpacked unpack(sizes s, packed p){
unpacked up;
int i=0, x;
int index=0, temp;
up.n = s.numWidths;
up.values = (int*)malloc(sizeof(int) * p.n);
x=0;
index=0;
temp = p.fieldValues[0];
for( i=0; i<up.n; i++){
if ( index + s.fieldWidths[i] > 32){
int partb2 = (index+s.fieldWidths[i] - 32);
int partb1 = s.fieldWidths[i] - partb2;
int part1 = temp >> (32-partb1);
up.values[i] = part1 << partb2;
temp = p.fieldValues[++x];
up.values[i] |= temp >> (32-partb2);
temp <<= partb2;
index =partb2;
continue;
}
up.values[i] = temp >> (32-s.fieldWidths[i]);
temp <<= s.fieldWidths[i];
index += s.fieldWidths[i];
}
return up;
} // end of unpack function
最佳答案
我认为您遇到了麻烦,因为packed
是可用于结构的属性,用于指示结构应该在结构元素之间没有填充的情况下存储。这或多或少与您指示的错误消息一致。
要证明或反驳此理论,请将packed
重命名为其他名称,例如Packed
,然后查看是否有帮助。在defs.h
和packed.c
中进行操作。如果错误消息的更改不只是由于重命名操作而导致的更改,那么它会有所帮助。如果该消息之前先说过关于packed
的内容,然后又说了Packed
,则它没有帮助。如果错误消息发生了重大变化(或根本不再存在),则packed
关键字很麻烦。
在GCC中,您需要使用诸如__attribute__((packed))
之类的符号来获得打包的结构。您不能偶然使用它。
注意,您通常不编译头文件。您编译使用标头的源文件。目前尚不清楚为什么要尝试与标题链接。您链接目标文件和库。
我可以确认您的defs.h
文件在带有GCC 4.8.2的Mac OS X 10.9.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 <math.h>
,并且两个源文件都需要添加#include <stdlib.h>
。但是,在添加这些内容之后,代码将使用以下更为严格的编译选项进行干净的编译:$ 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
$
这实际上使我相信您的问题是名称
packed
。OTOH,MSDN表明您需要使用
#pragma pack(2)
来打包结构。那也不是偶然使用的。不过,当包含缺少的标头时,您显示的代码可以在Unix系统上干净地编译。如果不能在MSVC中干净地编译,则问题是MSVC环境中固有的,而不是C语言中的固有问题。