Linux C++编译报错:"multiple definition of" / "does not name a type"

最近编译larbin_daemon爬虫服务器端管理程序时,总是会报如下的错误:

g++    -c -o editConf.o editConf.cpp
editConf.cpp:49:8: error: redefinition of ‘std::string projectG’
editConf.h:34:8: error: ‘std::string projectG’ previously declared here
editConf.cpp:50:8: error: redefinition of ‘std::string ipG’
editConf.h:35:8: error: ‘std::string ipG’ previously declared here
editConf.cpp:51:8: error: redefinition of ‘std::string httpPortG’
editConf.h:36:8: error: ‘std::string httpPortG’ previously declared here
editConf.cpp:52:8: error: redefinition of ‘std::string pagesConnexionsG’
editConf.h:37:8: error: ‘std::string pagesConnexionsG’ previously declared here
editConf.cpp:53:8: error: redefinition of ‘std::string dnsConnexionsG’
editConf.h:38:8: error: ‘std::string dnsConnexionsG’ previously declared here
editConf.cpp:54:8: error: redefinition of ‘std::string depthInSiteG’
editConf.h:39:8: error: ‘std::string depthInSiteG’ previously declared here
editConf.cpp:55:8: error: redefinition of ‘std::string waitDurationG’
editConf.h:40:8: error: ‘std::string waitDurationG’ previously declared here
editConf.cpp:56:8: error: redefinition of ‘std::string timeoutPageG’
editConf.h:41:8: error: ‘std::string timeoutPageG’ previously declared here
editConf.cpp:57:8: error: redefinition of ‘std::string timeoutIncrG’
editConf.h:42:8: error: ‘std::string timeoutIncrG’ previously declared here
make: *** [editConf.o] Error 1

十分困惑,明明只定义了一次嘛!

其实,

editConf.h中,有如下代码片段:

string projectG;//G代表global,类中也有对应的私有变量
string ipG;
string httpPortG;
string pagesConnexionsG;
string dnsConnexionsG;
string depthInSiteG;
string waitDurationG;
string timeoutPageG;
string timeoutIncrG;

然后在editConf.cpp中是直接用了(赋值什么的)如:

httpPortG = r[6];

在editConf.cpp和main.cpp中都包含了editConf.h头文件,这就问题所在。

当你在头文件中声明一个变量,就像我在editConf.h中写的,每个包含了该头文件的源文件,无论是直接的还是间接的,都会获得一个它自己对于该变量的拷贝,那么当你link所有的.o文件到一起时候,linker就会认为该变量在多个.o文件中被实例化了。

解决的方法是:在头文件中(如editConf.h)用extern声明变量,在对应的源文件中(如editConf.cpp)实例化变量。

参考资料:

http://stackoverflow.com/questions/18763270/c-linking-error-with-multiple-definition-on-linux

时间: 2024-10-24 20:26:00

Linux C++编译报错:"multiple definition of" / "does not name a type"的相关文章

linux + eclipse + cdt 报错undefined reference......好麻烦的,这位大牛给出的方法可行,特此MARK!!!!

http://bbs.csdn.net/topics/390239632 kerosun kerosun 等级: 结帖率:96.92% 楼主 发表于: 2012-10-11 12:00:51 比如有一个tools工程,提供给其他工程通用的工具函数. 我现在的做法就只能是ctrl+c|ctrl+v一旦工具函数发生变化,还需要在用到这些函数的工程中更新,比较麻烦. 看到eclipse工程属性设置中有Project References,但是一直不会用.那位好心人能说说怎样实现我的需求. 更多0分享到

gcc编译报错:程序中有游离的‘\357’‘\273’‘\277’等

造成的原因主要有两个: 1. 程序(*.c,*.h)中使用了中文的标点符号(全角),比如:,},+. 改成英文的标点半角符号就行了. 甚至有时候空格也会出现类似错误,删掉该空格 重新输入. vim里面做类似替换还是很容易的. 如何看到报错的符号? od -c hello.c > log.txt 在log中就能看到符号了 2. 如果替换成了英文标点还出错的话,还报此错误,那么就是文件存贮格式的问题了. 一般在windows下的文件都存成ansi格式,为了在linux下能通用,建议保存成UTF-8不

Linux 格式化分区 报错Could not stat --- No such file or directory 和 partprobe 命令

分区的过程正常: [[email protected] /]# fdisk -l Disk /dev/sda: 21.4 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot      Start         End      Blocks   Id  System /dev/sda1   *

android4.4 编译报错,和llvm 有关的

问题描述 最近想看一下android4.4 的source ,但是在编译的过程中遇到了下面的问题,各位大哥帮忙看一下,我实在是搞不定了,网上介绍的关于4.0 的类似的错误修改方法在4.4 上无效,其实错误也不是一样的. 4.0 的错误修改方法: $vi external/llvm/llvm-host-build.mk + LOCAL_LDLIBS := -lpthread -ldl 下面的是4.4 编译报错信息 external/llvm/lib/Transforms/Vectorize/BBV

一看便知linux下mysql报错ERROR 1044: Access denied for user: '@localhost' to database 'mysql'

错误信息:ERROR 1044: Access denied for user: '@localhost' to database 'mysql' linux下解决方案: mysql> use mysql ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'mysql' mysql> exit Bye [[email protected] ~]# service mysqld stop如果该命令不

选iphone5可以正常编译运行 , 但是5s和6和6s都会编译报错

选iphone5可以正常编译运行   但是5s和6和6s都会编译报错 iphone6编译报错iphone5s编译报错 解决办法是,Build settings里面把Architectures里面的$(ARCHS_STANDARD)去掉,加入armv7和armv7s两个.

linux mysql启动报错Can't open and lock privilege tables: Table 'mysql.host' doesn't exist

vi /etc/my.cnf  查看日志文件路径: log-error=/var/log/mysqld.log 查看报错日志: 之前的服务器被别人拿了,所以自己买了台美国vps,根据笔记安装完启动mysql,又启动不了. 查看了错误日志 引用 090321 18:55:03 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data /usr/local/mysql/libexec/mysqld: Ta

php编译报错

最近发现MDT推出去的系统的有不同问题,其问题就不说了,主要是策略权限被域继承了.比如我们手动安装的很多东东都是未配置壮态,推的就默认为安全壮态了,今天细找了一下,原来把这个关了就可以了. php编译报错,布布扣,bubuko.com

DVR_RDK编译报错

报错信息: abnormal termination of /opt/dm8168/dvr_rdk/../ti_tools/cgt_dsp/cgt6x_7_3_5//bin/cmp6x make[2]: *** [/opt/dm8168/dvr_rdk/../dvr_rdk/build/dvr_rdk/obj/ti816x-evm/c6xdsp/debug/MAIN_APP_c6xdsp_pe674.oe674] Error 1 make[1]: *** [apps] Error 2 make: