C++/G++ Maxmind geolite2++ 第三方共享对象 undefined reference

标签 c++ g++ maxmind

我发布了this question昨天被标记为重复,在阅读原件后,我能够让我的编译更进一步。 (一旦我解决或放弃了这个问题,就会删除链接的问题)。

现在我有两个 g++ 命令编译为 .o 文件,但仍然存在有关第三方的 undefined reference 错误。因此我从 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 共享库的问题还是该库的问题?答案是在我原来问题的拷贝(上面的链接)中找到的还是其他的?如果这个问题很新手,请提前道歉,但我有点超出了我的深度。预先感谢您的帮助。

问候,

詹姆斯

最佳答案

谷歌搜索那些 undefined symbol ,似乎libgeolite2++libmaxminddb有未声明(且未记录)的依赖关系。 .

由于未声明,ldd 没有任何帮助;但是,即使声明了它,您仍然需要将其他依赖项链接到可执行文件中。

您可以深入安装和链接该依赖项,和/或者您可以与libgeolite2++的作者交谈。

关于C++/G++ Maxmind geolite2++ 第三方共享对象 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44051875/

相关文章:

c++ - 内联汇编中的 sse 约束不起作用

javascript - 我的 IP 地址的 Maxmind GeoIP 重定向异常

nginx - GeoIP.dat.gz 和 GeoLiteCity.dat.gz 不再可用?获取 404 尝试加载它

c++ - 一般打印一系列变量及其名称

c++ - 虚基类初始化

c++ - 转换 std::vectors 的简单模板函数 - "illegal use of this type as an expression"

java - GeoLite2 数据库在添加到 jar 时损坏

c++ - 在参数列表中使用表达式的意外输出

c++ - Makefile 重复符号

c++ - 编译扩展名为.c的CPP程序