2009-09-28 22 views
2

我正在编写一个使用ossp-uuid的程序,它定义了一个名为uuid_t的类型。现在,我遇到的问题是这种类型已经在Mac OSX中的unistd.h文件中定义了。编译具有冲突类型的C代码

所以,我得到的错误是:

/opt/local/include/ossp/uuid.h:94: error: conflicting types for 'uuid_t' 
/usr/include/unistd.h:133: error: previous declaration of 'uuid_t' was here 

我请编译我的程序有:

gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" - 
DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" 
-DPACKAGE=\"epride\" -DVERSION=\"0.2\" -I. -I/usr/local/BerkeleyDB.4.7/include 
-I/opt/local/include -I/opt/local/include/db47 -I/opt/local/include/libxml2 
`pkg-config --cflags glib-2.0` -DNUM_REPLICAS=1 -DGEN_SIZE=10 -g -O2 -MT 
libepride_a-conflictset.o -MD -MP -MF .deps/libepride_a-conflictset.Tpo 
-c -o libepride_a-conflictset.o `test -f 'conflictset.c' 
|| echo './'`conflictset.c 

有没有办法告诉GCC,他应该忽略来自unistd.h中的类型?因为我使用unistd.h来处理其他事情。

在uuid.h有这些行:

/* workaround conflicts with system headers */ 
#define uuid_t  __vendor_uuid_t 
#define uuid_create __vendor_uuid_create 
#define uuid_compare __vendor_uuid_compare 
#include <sys/types.h> 
#include <unistd.h> 
#undef uuid_t 
#undef uuid_create 
#undef uuid_compare 

难道不应该照顾它?

在此先感谢!

+0

解决的办法是添加此,我使用uuid_t: 的#ifndef _UUID_T 的#include #ENDIF – DeeD

回答

2

你应该检查/opt/local/include/ossp/uuid.h在94行,并希望有一个定义为uuid_t。希望你会发现这样的:

#ifndef UUID_T_DEFINED 
#define UUID_T_DEFINED 
typedef uuid_t .... whatever 
#endif 

如果谁写的标题做了这样的球员,那么你可以修改代码:

#include <unistd.h> 
#define UUID_T_DEFINED 
#include <ossp/uuid.h> 

这样一来,他第二#INCLUDE赢在ossp/uuid.h中没有找到uuid_t的声明。

+0

好一点。在尝试我的建议之前试试这个。 – Thomas

+0

我只发现: /* UUID抽象数据类型*/ struct uuid_st; typedef struct uuid_st uuid_t; – DeeD

+0

你应该检查unistd.h。 – jbcreix

2

这样的事情?

#define uuid_t unistd_uuid_t 
#include <unistd.h> 
#undef uuid_t 
#include <ossp/uuid.h> /* or whatever header you're including */ 

这是丑陋的,但远,它的ç...

1

如果您有机会获得OSSP的UUID库的源代码,那么你就可以违规标识重命名为类似与简单的文本搜索ossp_uuid_t - 和替换。重新编译并重新安装库,一切都应该没问题。

0

这可能比您需要的更复杂,但一种选择是将ossp-uuid包装到共享库中,并创建一个不会暴露底层uuid_t类型的API。