c++中的多重定义错误
Posted
技术标签:
【中文标题】c++中的多重定义错误【英文标题】:a multiple definition error in c++ 【发布时间】:2011-11-11 21:55:20 【问题描述】:我有 2 个文件,grabURL.cpp 和 grabURL.hpp。当我用 gcc 编译两者时,它给了我多个定义错误。
grabURL.cpp
#include "grabURL.hpp"
size_t buffer(void *ptr, size_t size, size_t nmemb, void *stream)
int numbytes = size*nmemb;
char lastchar = *((char *) ptr + numbytes - 1);
*((char *) ptr + numbytes - 1) = '\0';
ret.append((char *)ptr);
ret.append(1,lastchar);
*((char *) ptr + numbytes - 1) = lastchar;
return size*nmemb;
void grabURL(std::string url, std::string *theRet)
curl_easy_setopt(curl,CURLOPT_URL,url.c_str());
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION, buffer);
res = curl_easy_perform(curl);
*theRet = ret;
grabURL.hpp:
#ifndef CURLURLGRAB_HPP
#define CURLURLGRAB_HPP
#include <string>
#include <curl/curl.h>
CURL * curl;
CURLcode res;
std::string ret;
size_t buffer(void *ptr, size_t size, size_t nmemb, void *stream);
void grabURL(std::string url,std::string* theRet);
#endif
我不知道我做错了什么,我以为我做了 ifndef 正确的事情。到底有什么问题?
【问题讨论】:
确切错误信息是什么? g++ main.cpp grabURL.cpp -o test -lcurl /tmp/cceVAPGI.o:(.bss+0x0): 多重定义curl' /tmp/ccC6uR4k.o:(.bss+0x0): first defined here /tmp/cceVAPGI.o:(.bss+0x8): multiple definition of
res' /tmp/ccC6uR4k.o:( .bss+0x8): 这里首先定义 /tmp/cceVAPGI.o:(.bss+0x10): `ret'的多重定义 /tmp/ccC6uR4k.o:(.bss+0x10): 这里首先定义
【参考方案1】:
这个定义在你的头文件中:
CURL * curl;
CURLcode res;
std::string ret;
当您包含 cpp 文件中的文件时得到定义,并且可能还有一些其他翻译单元(可能是 main.cpp?)
它们看起来不像应该在头文件中的东西,但如果有,那么您可以在头文件中声明它们 extern
并将实际定义移动到 cpp 文件中。
【讨论】:
我将 CURL * curl 和 CURLcode res 放在 .cpp 文件中,没有产生错误。究竟是什么让它不是你不会放在头文件中的东西?我还没有定义任何变量。 @user1042519:你什么意思?这3个是变量定义。而且通常不希望在头文件中定义任何变量,因为它会触发多个定义错误。 那么为什么我可以在类中而不是在 .hpp 文件本身上做类似的事情呢?也许我认为它的工作原理与类完全一样。 @user1042519:因为类的成员对象在实例化此类的对象之前不会实例化。除非它们是静态成员对象,它们确实是变量定义。以上是关于c++中的多重定义错误的主要内容,如果未能解决你的问题,请参考以下文章
致命错误 LNK1169:找到一个或多个多重定义符号 (C++)