Project1

标题: C++重复定义是肿么了? [打印本页]

作者: yangff    时间: 2011-10-1 10:04
标题: C++重复定义是肿么了?
本帖最后由 yangff 于 2011-10-1 10:07 编辑

看起来是重复定义了但是很奇怪的是我所有的头文件都加上了#pragma once和宏……
出错的都是
  1. #pragma data_seg("SharedDataName")

  2. HHOOK hHook = 0;
  3. int hPid=0;

  4. HWND hWnd=0;
  5. bool needInitProc=false;
  6. HWND hMenu=0;
  7. HMENU hPop=0;
  8. long oProc=0;
  9. #pragma data_seg()
复制代码
里面定义的东西……
  1. Error        8        error LNK2005: "struct HWND__ * hWnd" (?hWnd@@3PAUHWND__@@A) already defined in PluginBase.obj        D:\visual studio 2010\Projects\RMPlus\RMPlus\PluginHost.obj        RMPlus
  2. Error        16        error LNK2005: "struct HWND__ * hWnd" (?hWnd@@3PAUHWND__@@A) already defined in PluginBase.obj        D:\visual studio 2010\Projects\RMPlus\RMPlus\RMPlus.obj        RMPlus
  3. Error        7        error LNK2005: "struct HWND__ * hMenu" (?hMenu@@3PAUHWND__@@A) already defined in PluginBase.obj        D:\visual studio 2010\Projects\RMPlus\RMPlus\PluginHost.obj        RMPlus
  4. Error        15        error LNK2005: "struct HWND__ * hMenu" (?hMenu@@3PAUHWND__@@A) already defined in PluginBase.obj        D:\visual studio 2010\Projects\RMPlus\RMPlus\RMPlus.obj        RMPlus
  5. Error        6        error LNK2005: "struct HMENU__ * hPop" (?hPop@@3PAUHMENU__@@A) already defined in PluginBase.obj        D:\visual studio 2010\Projects\RMPlus\RMPlus\PluginHost.obj        RMPlus
  6. Error        14        error LNK2005: "struct HMENU__ * hPop" (?hPop@@3PAUHMENU__@@A) already defined in PluginBase.obj        D:\visual studio 2010\Projects\RMPlus\RMPlus\RMPlus.obj        RMPlus
  7. Error        3        error LNK2005: "struct HINSTANCE__ * hMod" (?hMod@@3PAUHINSTANCE__@@A) already defined in PluginBase.obj        D:\visual studio 2010\Projects\RMPlus\RMPlus\PluginHost.obj        RMPlus
  8. Error        11        error LNK2005: "struct HINSTANCE__ * hMod" (?hMod@@3PAUHINSTANCE__@@A) already defined in PluginBase.obj        D:\visual studio 2010\Projects\RMPlus\RMPlus\RMPlus.obj        RMPlus
  9. Error        4        error LNK2005: "struct HHOOK__ * hHook" (?hHook@@3PAUHHOOK__@@A) already defined in PluginBase.obj        D:\visual studio 2010\Projects\RMPlus\RMPlus\PluginHost.obj        RMPlus
  10. Error        12        error LNK2005: "struct HHOOK__ * hHook" (?hHook@@3PAUHHOOK__@@A) already defined in PluginBase.obj        D:\visual studio 2010\Projects\RMPlus\RMPlus\RMPlus.obj        RMPlus
  11. Error        2        error LNK2005: "long oProc" (?oProc@@3JA) already defined in PluginBase.obj        D:\visual studio 2010\Projects\RMPlus\RMPlus\PluginHost.obj        RMPlus
  12. Error        10        error LNK2005: "long oProc" (?oProc@@3JA) already defined in PluginBase.obj        D:\visual studio 2010\Projects\RMPlus\RMPlus\RMPlus.obj        RMPlus
  13. Error        1        error LNK2005: "int hPid" (?hPid@@3HA) already defined in PluginBase.obj        D:\visual studio 2010\Projects\RMPlus\RMPlus\PluginHost.obj        RMPlus
  14. Error        9        error LNK2005: "int hPid" (?hPid@@3HA) already defined in PluginBase.obj        D:\visual studio 2010\Projects\RMPlus\RMPlus\RMPlus.obj        RMPlus
  15. Error        5        error LNK2005: "bool needInitProc" (?needInitProc@@3_NA) already defined in PluginBase.obj        D:\visual studio 2010\Projects\RMPlus\RMPlus\PluginHost.obj        RMPlus
  16. Error        13        error LNK2005: "bool needInitProc" (?needInitProc@@3_NA) already defined in PluginBase.obj        D:\visual studio 2010\Projects\RMPlus\RMPlus\RMPlus.obj        RMPlus
复制代码
另外这一坨是什么……
  1. Error        36        error LNK2001: unresolved external symbol _ruby_sysinit        D:\visual studio 2010\Projects\RMPlus\RMPlus\RMPlus.obj        RMPlus
  2. Error        34        error LNK2001: unresolved external symbol _ruby_set_argv        D:\visual studio 2010\Projects\RMPlus\RMPlus\RMPlus.obj        RMPlus
  3. Error        35        error LNK2001: unresolved external symbol _ruby_script        D:\visual studio 2010\Projects\RMPlus\RMPlus\RMPlus.obj        RMPlus
  4. Error        32        error LNK2001: unresolved external symbol _ruby_init_loadpath        D:\visual studio 2010\Projects\RMPlus\RMPlus\RMPlus.obj        RMPlus
  5. Error        39        error LNK2001: unresolved external symbol _ruby_init        D:\visual studio 2010\Projects\RMPlus\RMPlus\RMPlus.obj        RMPlus
  6. Error        37        error LNK2001: unresolved external symbol _ruby_finalize        D:\visual studio 2010\Projects\RMPlus\RMPlus\RMPlus.obj        RMPlus
  7. Error        27        error LNK2001: unresolved external symbol _rb_str_new_cstr        D:\visual studio 2010\Projects\RMPlus\RMPlus\PluginHost.obj        RMPlus
  8. Error        30        error LNK2001: unresolved external symbol _rb_str_freeze        D:\visual studio 2010\Projects\RMPlus\RMPlus\PluginHost.obj        RMPlus
  9. Error        38        error LNK2001: unresolved external symbol _rb_require        D:\visual studio 2010\Projects\RMPlus\RMPlus\RMPlus.obj        RMPlus
  10. Error        25        error LNK2001: unresolved external symbol _rb_num2long        D:\visual studio 2010\Projects\RMPlus\RMPlus\PluginHost.obj        RMPlus
  11. Error        31        error LNK2001: unresolved external symbol _rb_intern        D:\visual studio 2010\Projects\RMPlus\RMPlus\RMPlus.obj        RMPlus
  12. Error        24        error LNK2001: unresolved external symbol _rb_int2inum        D:\visual studio 2010\Projects\RMPlus\RMPlus\PluginHost.obj        RMPlus
  13. Error        33        error LNK2001: unresolved external symbol _rb_funcall        D:\visual studio 2010\Projects\RMPlus\RMPlus\RMPlus.obj        RMPlus
  14. Error        29        error LNK2001: unresolved external symbol _rb_define_module_function        D:\visual studio 2010\Projects\RMPlus\RMPlus\PluginHost.obj        RMPlus
  15. Error        28        error LNK2001: unresolved external symbol _rb_define_module        D:\visual studio 2010\Projects\RMPlus\RMPlus\PluginHost.obj        RMPlus
  16. Error        26        error LNK2001: unresolved external symbol _rb_define_const        D:\visual studio 2010\Projects\RMPlus\RMPlus\PluginHost.obj        RMPlus
  17. Error        23        error LNK2001: unresolved external symbol "unsigned long rb_cPluginHost" (?rb_cPluginHost@@3KA)        D:\visual studio 2010\Projects\RMPlus\RMPlus\PluginHost.obj        RMPlus
  18. Error        22        error LNK2001: unresolved external symbol "public: static class std::map<long,unsigned long,struct std::less<long>,class std::allocator<struct std::pair<long const ,unsigned long> > > MPluginHost::menu" (?menu@MPluginHost@@2V?$map@JKU?$less@J@std@@V?$allocator@U?$pair@$CBJK@std@@@2@@std@@A)        D:\visual studio 2010\Projects\RMPlus\RMPlus\PluginHost.obj        RMPlus
  19. Error        40        error LNK1120: 18 unresolved externals        D:\visual studio 2010\Projects\RMPlus\Release\RMPlus.dll        RMPlus
复制代码

作者: 苏小脉    时间: 2011-10-1 12:13
error LNK2005: "struct HWND__ * hWnd" (?hWnd@@3PAUHWND__@@A) already defined in PluginBase.obj

这个是链接错误,而 #pragma once 只是起到了 inclusion guard 的作用,主要是用来防止编译时的接口雏形、类型声明重定义的(当然如果把定义也放进头文件,就也会发生链接的错误)。这个错误的意思是:你在 PluginBase.obj 这个编译单元定义了相同的全局变量 hWnd,而非静态的全局变量的标识符必须在所有编译单元中都具有唯一性。如果按照 C、C++ 的惯例,一个 *{.c,.cxx,.cc,.cpp} 文件就是一个编译单元。如果你要在不同编译单元共享全局变量,只须在其中一个单元中正常声明全局变量,而其它需要引用这些变量的单元中用 extern 修饰变量即可,如此一来这些全局变量自始至终都只有一份拷贝。如果你需要各个编译单元有自己的全局变量的拷贝,但名称可能会与别的单元相同,那就用 static 修饰变量,使变量拥有静态属性,局部于一个编译单元。

另外这一坨是什么……

一堆链接时找不到的符号。你确定你正确链接了 Ruby 的库?
作者: 禾西    时间: 2011-10-1 13:37
本帖最后由 禾西 于 2011-10-2 02:10 编辑

捉到老板借道問一下,近來的VS老是在編譯的時候沒反應,等好幾十分鐘之後才告訴我內部錯誤。重裝了也是個樣子,究竟是啥回事。

--------------------------------------------------------------------
找到原因了……是給.net 4打補丁的時候因為某種原因失敗了。把.net 4 extend 刪掉重裝就行。囧了我兩個星期呀(死)
作者: yangff    时间: 2011-10-1 14:10
本帖最后由 yangff 于 2011-10-1 14:10 编辑
苏小脉 发表于 2011-10-1 12:13
这个是链接错误,而 #pragma once 只是起到了 inclusion guard 的作用,主要是用来防止编译时的接口雏形、 ...


就是不能用extern ,我变量声明的头是所有文件都引用的额……而且extern 不支持data_seg
作者: tamashii    时间: 2011-10-1 19:23
好像只有VC有这种问题吧,我也发现过,请看:
http://rpg.blue/thread-165753-1-1.html
作者: zhixin1997    时间: 2011-10-1 21:25
- -呼叫KIMU
作者: 苏小脉    时间: 2011-10-1 23:19
yangff 发表于 2011-10-1 14:10
就是不能用extern ,我变量声明的头是所有文件都引用的额……而且extern 不支持data_seg ...

你头里面写的那个不叫变量声明,那个叫变量定义。声明只是表示在程序的某处有这么个标识符所标识的变量,而定义是实际分配存储空间。如果照你这么写,所有包含了这个头的源文件都会有一份这堆全局变量的拷贝,就会发生你前面的那个错误。

你要实现什么?各个源文件都能引用这段数据段的数据?那你需要做的就是在某个 *.{cxx,cc,cpp} 中加入这段变量定义,然后另外写一个头文件,里面用 extern 修饰这些符号,如此一来所有引用这个头文件的源文件就会在链接时寻址到你在之前那个源文件中定义的这些变量。

而且extern 不支持data_seg

那是自然,extern 修饰后表示当前变量只是一个符号的声明,并没有实际分配存储空间。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1