2011-11-11 5 views
-1

grabURL.cpp 및 grabURL.hpp 파일이 두 개 있습니다. gcc로 둘 다 컴파일하면 여러 정의 오류가 발생합니다.C에서 다중 정의 오류가 발생했습니다

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가 일을했다 생각했다. 정확히 무엇이 잘못 되었습니까? 헤더 파일에

+0

* 정확한 * 오류 메시지 란 무엇입니까? –

+0

g ++ main.cpp grabURL.cpp -o test -lcurl /tmp/cceVAPGI.o:(bss+0x0) : 'curl'다중 정의 /tmp/ccC6uR4k.o:(.bss+0x0) : 첫 번째 여기서 정의 됨 /tmp/cceVAPGI.o:(.bss+0x8) :'res '의 다중 정의 /tmp/ccC6uR4k.o:(.bss+0x8) : 여기서 처음 정의 됨 /tmp/cceVAPGI.o :(.bss + 0x10) :'ret '의 다중 정의 /tmp/ccC6uR4k.o:(.bss+0x10) : 여기에서 처음 정의 됨 – Thundaboom

답변

2

이 정의 : 당신이 (? 아마도 MAIN.CPP)

그들은 '돈 cpp가 파일에서 파일 및 pressumably 다른 번역 단위를 포함 할 때

CURL * curl; 
CURLcode res; 
std::string ret; 

정의 얻을 헤더 파일에 있어야 할 것으로 보이지만 헤더 파일에 extern을 선언하고 실제 정의를 cpp 파일로 옮길 수 있습니다.

+0

.cpp 파일에 CURL * curl 및 CURLcode res를 넣었으며 오류가 생성되지 않았습니다. 정확하게 헤더 파일에 넣지 않을 것이 아닌 것은 무엇입니까? 아직 어떤 변수도 정의하고 있지 않습니다. – Thundaboom

+0

@ user1042519 : 무슨 소리 야? 그것들은 변수 정의입니다. 그리고 여러 정의 오류를 유발하기 때문에 일반적으로 헤더 파일에 어떤 변수 정의도 필요하지 않습니다. –

+0

그렇다면 왜 내가 .hpp 파일 자체가 아니라 클래스에서 그렇게 할 수 있습니까? 어쩌면 나는 그것이 수업과 똑같이 작동한다고 생각하고있을 것입니다. – Thundaboom

관련 문제