2017-05-18 10 views
1

어제 this question를 게시했는데 원본을 읽은 후 조금 더 나아갈 수있었습니다. (일단 해결되었거나 포기 된 적이 있으면 연결된 질문이 삭제됩니다.)C++/G ++ Maxmind geolite2 ++ 제 3 자 공유 객체 정의되지 않은 참조

이제 두 개의 g ++ 명령이 .o 파일로 컴파일되지만, this library (geolite2 ++)에서 얻은 타사 .so와 관련하여 정의되지 않은 참조 오류가 있습니다.

sudo g++ -std=c++11 -I/home/ubuntu -L/home/ubuntu -g -lstdc++ -lgeolite2++ -c -O2 -MMD -MP -MF "main.o.d" -o main.o main.cpp 

(작업 표시)

sudo g++ -std=c++11 -L/home/ubuntu -I/home/ubuntu -pthread -g -o main main.o -lstdc++ -lgeolite2++ -lz -ldl 

이 (다음과 같은 오류가 발생하는 경우) 좀 더 연구를하고 읽은

/home/ubuntu/libgeolite2++.so: undefined reference to `MMDB_lookup_string' 
/home/ubuntu/libgeolite2++.so: undefined reference to `MMDB_free_entry_data_list' 
/home/ubuntu/libgeolite2++.so: undefined reference to `MMDB_open' 
/home/ubuntu/libgeolite2++.so: undefined reference to `MMDB_strerror' 
/home/ubuntu/libgeolite2++.so: undefined reference to `MMDB_lib_version' 
/home/ubuntu/libgeolite2++.so: undefined reference to `MMDB_aget_value' 
/home/ubuntu/libgeolite2++.so: undefined reference to `MMDB_get_entry_data_list' 
/home/ubuntu/libgeolite2++.so: undefined reference to `MMDB_get_metadata_as_entry_data_list' 
/home/ubuntu/libgeolite2++.so: undefined reference to `MMDB_close' 
collect2: error: ld returned 1 exit status 

: 여기

내 컴파일 명령입니다 here (Dmitry Yudakov의 답변) ldd 명령을 사용하여 /home/ubuntu/libgeolite2++.so 공유 객체가 종속성을 발견했습니다. 이러한 내 질문은로

#include <cstdlib> 
#include <iostream> 

#include <GeoLite2PP.hpp> 
#include <GeoLite2PP_error_category.hpp> 
#include <GeoLite2PP_version.hpp> 

using namespace std; 
using namespace GeoLite2PP; 

int main(int argc,char* argv[]) { 

    GeoLite2PP::DB db("./GeoIP2-City.mmdb"); 
    std::string json = db.lookup("216.58.216.163"); 
    std::cout << json << std::endl; 
} 

이 내 잘못 또는 인 /home/ubuntu/libgeolite2++.so 공유 라이브러리에 문제가 :

여기
ldd /home/ubuntu/libgeolite2++.so 
     linux-vdso.so.1 => (0x00007ffe7fae1000) 
     libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fb281442000) 
     libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb28122c000) 
     libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb280e64000) 
     libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb280b5e000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007fb2819d6000) 

내 프로그램 코드 : 내 출력은 이러한 경우가 나타냅니다 도서관에 문제가 있습니까? 그 대답은 원래의 질문 (위의 링크)의 사본에서 발견 되는가 아니면 다른 것입니까? 이 질문이 아주 새내기 인 경우에 사과, 그러나 나는 나의 깊이에서 조금이다. 모든 도움을 미리 감사드립니다.

감사합니다,

제임스 그 정의되지 않은 심볼을 인터넷 검색을

답변

1

, libgeolite2 ++libmaxminddb에 선언되지 않은 (미등록) 종속성이 보인다.

신고하지 않았으므로 ldd은 도움이되지 않습니다. 그러나 선언 된 경우에도 다른 종속성을 실행 파일에 링크해야합니다.

종속성을 설치하고 링크 할 수 있으며, 또는 libgeolite2 ++의 작성자에게 이야기 할 수 있습니다.

+0

감사합니다. BoundaryImposition, 코드에 연락처가 있습니다. 사건을보고하겠습니다. –