设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1977|回复: 6
打印 上一主题 下一主题

[有事请教] C++重复定义是肿么了?

[复制链接]

Lv2.观梦者

傻♂逼

梦石
0
星屑
369
在线时间
1605 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

跳转到指定楼层
1
发表于 2011-10-1 10:04:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 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
复制代码
哎呀,蛋疼什么的最有爱了

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
2
发表于 2011-10-1 12:13:23 | 只看该作者
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 的库?
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv3.寻梦者

酱油的

梦石
0
星屑
970
在线时间
2161 小时
注册时间
2007-12-22
帖子
3271

贵宾

3
发表于 2011-10-1 13:37:19 | 只看该作者
本帖最后由 禾西 于 2011-10-2 02:10 编辑

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

--------------------------------------------------------------------
找到原因了……是給.net 4打補丁的時候因為某種原因失敗了。把.net 4 extend 刪掉重裝就行。囧了我兩個星期呀(死)

点评

没遇见过……换个版本试试?  发表于 2011-10-1 23:21
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
369
在线时间
1605 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

4
 楼主| 发表于 2011-10-1 14:10:09 | 只看该作者
本帖最后由 yangff 于 2011-10-1 14:10 编辑
苏小脉 发表于 2011-10-1 12:13
这个是链接错误,而 #pragma once 只是起到了 inclusion guard 的作用,主要是用来防止编译时的接口雏形、 ...


就是不能用extern ,我变量声明的头是所有文件都引用的额……而且extern 不支持data_seg
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
491
在线时间
339 小时
注册时间
2010-12-15
帖子
926

开拓者

5
发表于 2011-10-1 19:23:53 | 只看该作者
好像只有VC有这种问题吧,我也发现过,请看:
http://rpg.blue/thread-165753-1-1.html
回复 支持 反对

使用道具 举报

Lv1.梦旅人

反伸手党斗士

梦石
0
星屑
91
在线时间
1128 小时
注册时间
2009-9-10
帖子
2513

贵宾

6
发表于 2011-10-1 21:25:34 | 只看该作者
- -呼叫KIMU
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
7
发表于 2011-10-1 23:19:49 | 只看该作者
yangff 发表于 2011-10-1 14:10
就是不能用extern ,我变量声明的头是所有文件都引用的额……而且extern 不支持data_seg ...

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

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

而且extern 不支持data_seg

那是自然,extern 修饰后表示当前变量只是一个符号的声明,并没有实际分配存储空间。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-4 00:57

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表