C++ / G++ Maxmind geolite2++ 第三方共享对象未定义引用
C++ / G++ Maxmind geolite2++ third party shared object undefined reference
我昨天发布了 this question,它被标记为重复,在阅读原文后我能够让我的编译更进一步。 (一旦我解决或放弃了这个问题,就会删除 linked 问题)。
现在我有两个 g++ 命令编译成 .o 文件,但仍然存在关于第三方的未定义引用错误。所以我从 this library (geolite2++) 获得。
这是我的编译命令:
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
共享库的问题是我的错还是库的问题?答案是在我原来的问题(上面的link)的副本中找到还是其他?如果这个问题是新手,请提前致歉,但我有点不知所措。在此先感谢您的帮助。
此致,
詹姆斯
谷歌搜索那些未定义的符号,似乎 libgeolite2++ 对 libmaxminddb.
有未声明(和未记录)的依赖
由于未申报,ldd
没有帮助;但是,即使它已被声明,您仍然需要 link 将其他依赖项添加到您的可执行文件中。
您可以深入了解安装和 linking 该依赖项,and/or您可以与 libgeolite2++.
的作者联系
我昨天发布了 this question,它被标记为重复,在阅读原文后我能够让我的编译更进一步。 (一旦我解决或放弃了这个问题,就会删除 linked 问题)。
现在我有两个 g++ 命令编译成 .o 文件,但仍然存在关于第三方的未定义引用错误。所以我从 this library (geolite2++) 获得。
这是我的编译命令:
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
共享库的问题是我的错还是库的问题?答案是在我原来的问题(上面的link)的副本中找到还是其他?如果这个问题是新手,请提前致歉,但我有点不知所措。在此先感谢您的帮助。
此致,
詹姆斯
谷歌搜索那些未定义的符号,似乎 libgeolite2++ 对 libmaxminddb.
有未声明(和未记录)的依赖由于未申报,ldd
没有帮助;但是,即使它已被声明,您仍然需要 link 将其他依赖项添加到您的可执行文件中。
您可以深入了解安装和 linking 该依赖项,and/or您可以与 libgeolite2++.
的作者联系