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++中的多重定义错误的主要内容,如果未能解决你的问题,请参考以下文章

C++ - “函数的多重定义”我们如何解决它?

致命错误 LNK1169:找到一个或多个多重定义符号 (C++)

C++:包含父类时出现多重定义错误?

C++:“mainCRTStartup”错误等的多重定义

gcc:在 C++ 应用程序中链接 C 库会导致“多重定义”错误

结构的多重定义错误,但我在任何地方都看不到错误(C++)