c++ - "undefined reference to"共享库中的许多(全部?)函数(新手)

标签 c++ reference undefined shared

我是 C++ 的新手。如果这是不连贯的,请耐心等待。我被要求在 Linux 上构建一个大型系统,该系统最初是在 OS X 上构建的,它运行良好。原作者已不在公司。构建系统使用 autotools,但也有一些手工制作的 Makefile,它们遍历调用自动制作的 Makefile 的系统。我已经设法编译了所有的 C++ 代码。构建系统也使用libtools,共享库生成存放在/usr/local/lib。

所以现在我想使用这些库。我写了一个简短的程序,它简单地实例化类 ds_dictionary 的对象并调用其中一个方法。在这里:

#include <iostream>
#include <DSUtils/DSUtils.h>

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

    int32_t integer_data=123;
    char key_alice_integer[] = "alice_integer"; 

    ds_dictionary my_dict;
    my_dict.add_int(key_alice_integer, integer_data);

    return 0;
}

我编译这个

g++ -lDSUtils -o main my_test_code.cpp

结果:

//usr/local/lib/libDSUtils.so: undefined reference to `ds_breakdown_from_time_interval'
//usr/local/lib/libDSUtils.so: undefined reference to `ds_date_breakdown_with_string'
//usr/local/lib/libDSUtils.so: undefined reference to `ds_seconds_duration_of_interval'
...  (about 25 lines like these)
collect2: ld returned 1 exit status

让我们看看图书馆的内部:

garyp@VM:/usr/local/lib$ nm libDSUtils.so | grep ds_breakdown_from_time
    U ds_breakdown_from_time_interval
  1. 上一行中的“U”……这是否意味着库构建不正确?
  2. 我是否正确地调用了 g++?
  3. 我是否必须在代码中添加一些内容来告诉它我正在使用该库中的函数?
  4. 可能的错误是什么?我应该从哪里开始探索?

编辑: 啊哈。库 DSUtils 是从几个 c++ 源构建的。源码中有一个c程序,包含了所有的问题函数。 Makefile 系统根本不处理那个 c 文件。该c程序编译。理想情况下,我想我会弄清楚如何修改 Makefile 以编译该文件并将其添加到库中,但我还没到可以弄清楚如何做到这一点的地步。

我可以将 .o 文件添加到现有库吗?如何?用一个文件创建一个库?等等?

EDIT_2:我只是做了

g++ -o main -lDSUtils main.o my_new_objectfile.o

然后这个东西编译、链接和运行都没有错误。那应该工作吗?修复逻辑错误后,它确实有效。

最佳答案

这个

U ds_breakdown_from_time_interval

告诉我 ds_breakdown_from_time_interval 将在运行时由另一个 库解析。所以我猜您需要链接到定义 ds_breakdown_from_time_interval 的库。

关于c++ - "undefined reference to"共享库中的许多(全部?)函数(新手),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5017792/

相关文章:

c++ - 使用单例时内存泄漏

c++ - 函数参数的类型转换

C++,返回对 std::set 项的 const 和非 const 引用

C++ - 更新指针中的值被覆盖

c - undefined reference to function 错误在c

javascript - ReferenceError SetInterval 未定义

c++ - 迭代 C++ 映射中的键

c++ - 观察内存位置/从代码安装 'data breakpoint'?

c++ - 将项目数据附加到菜单项

java - 运算符 * 未定义