2017-05-18 58 views
1

昨天我發佈了this question,它被標記爲重複項,讀完原始代碼後,我能夠讓我的編譯更進一步。 (一旦我解決了這個問題或放棄了,將刪除鏈接的問題)。C++/G ++ Maxmind geolite2 ++第三方共享對象undefined參考

現在我有兩個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共享對象已發現它的依賴關係。我的輸出結果表明是不是這樣的:

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) 

這裏是我的程序代碼:

#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共享庫,是我的錯或者是一個問題這是圖書館的問題嗎?答案可以在我的原始問題(上面的鏈接)的副本中找到,或者是其他內容嗎?如果這個問題非常新鮮,可以提前道歉,但是我有點偏離我的深度。預先感謝您的幫助。

問候,

詹姆斯

回答

1

谷歌搜索那些未定義的符號,似乎libgeolite2 ++libmaxminddb未聲明的(和未記錄的)依賴性。

由於未申報,ldd沒有幫助;然而,即使它被聲明,您仍然需要將其他依賴關係鏈接到您的可執行文件中。

您可以潛入安裝和鏈接該依賴項,和/或您可以與作者libgeolite2 ++

+0

謝謝BoundaryImposition,代碼中有聯繫人,我會報告事件。 –