&引用;未定义的引用;共享库中的许多(全部?)函数(新手) 我是C++初学者。如果这是不连贯的,请耐心等待。我被要求在linux上构建一个大型系统,这个系统最初是在OSX上构建的,在那里它运行良好。原作者已不在该公司工作。构建系统使用自动工具,但也有一些手工制作的Makefiles,它们在系统中遍历调用自动制作的Makefiles。我已经成功地编译了所有的C++代码。构建系统还使用libtools,共享库生成并存放在/usr/local/lib中

&引用;未定义的引用;共享库中的许多(全部?)函数(新手) 我是C++初学者。如果这是不连贯的,请耐心等待。我被要求在linux上构建一个大型系统,这个系统最初是在OSX上构建的,在那里它运行良好。原作者已不在该公司工作。构建系统使用自动工具,但也有一些手工制作的Makefiles,它们在系统中遍历调用自动制作的Makefiles。我已经成功地编译了所有的C++代码。构建系统还使用libtools,共享库生成并存放在/usr/local/lib中,c++,reference,undefined,shared,C++,Reference,Undefined,Shared,现在我想使用这些库。我编写了一个简短的程序,它只是实例化了类ds\u 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\u 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;
}
结果是:

//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
  • 上面一行中的“U”。。。这是否意味着图书馆没有正确建造
  • 我调用g++正确吗
  • 我是否必须在代码中添加一些东西来告诉它我正在使用该库中的函数
  • 可能的错误有哪些?我该从哪里开始闲逛
  • 编辑: 啊哈。库DSUTILS是由几个C++源构建的。源代码中有一个c程序,它包含所有有问题的函数。Makefile系统根本不处理这个c文件。那个c程序编译。理想情况下,我想我会找出如何修改Makefile来编译该文件并将其添加到库中,但我还没有找到解决方法

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

    编辑2:我就是这么做的

    g++ -o main -lDSUtils main.o my_new_objectfile.o
    
    而且编译、链接和运行都不会出错。这样行吗?在修复了一个逻辑错误之后,它就可以工作了。

    U ds_breakdown_from_time_interval
    
    告诉我在运行时另一个库将解析来自时间间隔的
    ds\u细分。因此,我猜您需要链接到从时间间隔定义的库

    U ds_breakdown_from_time_interval
    

    告诉我在运行时另一个库将解析来自时间间隔的
    ds\u细分。因此,我猜您需要链接到定义从时间间隔开始的
    ds\u细分的库。我想你已经把我带到了问题的根源。请参阅原始post.Ding中的我的编辑。我想你已经把我带到了问题的根源。请参阅原始帖子中的我的编辑。将要修复的Makefile的一些摘录会有所帮助。特别是,生成libDSUtils.so的部分,以及将*.cpp文件转换为*.o文件的部分。如果Makefile使用内置默认规则,则可能不会编写第二部分。要修复的Makefile的一些摘录可能会有所帮助。特别是,生成libDSUtils.so的部分,以及将*.cpp文件转换为*.o文件的部分。如果Makefile使用内置默认规则,则可能不会编写第二部分。