平成十八年五月七日 午前十時十三分 曇り
相关环境如下:
> 共包含有三个文件,其中一个.PC的,一个.C的,一个.H的文件.
> .H文件中定义了一个16*4的字符数组URL_DECODE,并为他赋了初值.
> .PC文件与.C的文件都对.H的头文件进行了引用
----------navigate.pc-------------
#include "navigate.h"
/* メイン処理 */
main( int argc , char *argv[] )
{
}
----------------------------------
----------tmp_common.c----------
#include "navigate.h"
int osc_user_div_chk( char *user_id )
{
return 0;
}
----------------------------------
-----------navigate.h-------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char URL_DECODE[16 * 4] = {
0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0xA , 0xB , 0xC , 0xD , 0xE , 0xF , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0xA , 0xB , 0xC , 0xD , 0xE , 0xF , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
};
----------------------------------
出现的问题:
在使用MAKEFILE文件对这三个文件进行编译时,出现了对URL_DECODE重复定义的错误.具体的错误信息如下:
ld: 重大なエラー: シンボル `URL_DECODE' は複数定義されています:
(ファイル /Project/MANAGE/QA0605/OSCPROB/src/tmp/navigate.o とファイル /var/tmp//cc2c6n90.o);
ld: 重大なエラー: ファイル処理エラー。/Project/MANAGE/QA0605/OSCPROB/src/tmp/navigate へ書き込まれる出力がありません。
造成出现此问题的原因:
在头文件中对URL_DECODE变量初过初值,并且在两个文件中都引用了URL_DECODE定义所在的头文件,这样就造成了每一次引用头文件时都对这个变量进行了定义并赋初值.
解决方法:
第一种方法:将URL_DECODE的定义部分更改为静态变量,这样就避免了在多次引用头文件时对该变量的多次定义赋初值.
static char URL_DECODE[16 * 4] = {
0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0xA , 0xB , 0xC , 0xD , 0xE , 0xF , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0xA , 0xB , 0xC , 0xD , 0xE , 0xF , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
};
第二种方法:不要在头文件中对变量赋初值.
> 共包含有三个文件,其中一个.PC的,一个.C的,一个.H的文件.
> .H文件中定义了一个16*4的字符数组URL_DECODE,并为他赋了初值.
> .PC文件与.C的文件都对.H的头文件进行了引用
----------navigate.pc-------------
#include "navigate.h"
/* メイン処理 */
main( int argc , char *argv[] )
{
}
----------------------------------
----------tmp_common.c----------
#include "navigate.h"
int osc_user_div_chk( char *user_id )
{
return 0;
}
----------------------------------
-----------navigate.h-------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char URL_DECODE[16 * 4] = {
0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0xA , 0xB , 0xC , 0xD , 0xE , 0xF , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0xA , 0xB , 0xC , 0xD , 0xE , 0xF , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
};
----------------------------------
出现的问题:
在使用MAKEFILE文件对这三个文件进行编译时,出现了对URL_DECODE重复定义的错误.具体的错误信息如下:
ld: 重大なエラー: シンボル `URL_DECODE' は複数定義されています:
(ファイル /Project/MANAGE/QA0605/OSCPROB/src/tmp/navigate.o とファイル /var/tmp//cc2c6n90.o);
ld: 重大なエラー: ファイル処理エラー。/Project/MANAGE/QA0605/OSCPROB/src/tmp/navigate へ書き込まれる出力がありません。
造成出现此问题的原因:
在头文件中对URL_DECODE变量初过初值,并且在两个文件中都引用了URL_DECODE定义所在的头文件,这样就造成了每一次引用头文件时都对这个变量进行了定义并赋初值.
解决方法:
第一种方法:将URL_DECODE的定义部分更改为静态变量,这样就避免了在多次引用头文件时对该变量的多次定义赋初值.
static char URL_DECODE[16 * 4] = {
0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0xA , 0xB , 0xC , 0xD , 0xE , 0xF , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0xA , 0xB , 0xC , 0xD , 0xE , 0xF , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
};
第二种方法:不要在头文件中对变量赋初值.