"неопределенная ссылка" на многие (все?) функции в общей библиотеке (новичок) - PullRequest
1 голос
/ 16 февраля 2011

Я новичок в C ++. Будьте терпеливы, если это бессвязно. Я призван построить большую систему на Linux, которая изначально была построена на OS X, где она отлично работает. Оригинальные авторы больше не с компанией. Система сборки использует автоинструменты, но есть также некоторые созданные вручную файлы Makefile, которые проходят через систему, вызывая автоматически созданные файлы Makefile. Мне удалось собрать весь код на С ++. Система сборки также использует 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. Какие возможны ошибки? С чего мне начать ковыряться?

EDIT: Ага. Библиотека DSUtils построена из нескольких источников C ++. В исходном коде есть одна программа на c, которая содержит все проблемные функции. Система Makefile вообще не работает с этим одним файлом c. Эта программа скомпилируется. В идеале, я полагаю, я бы выяснил, как изменить Makefile для компиляции этого файла и добавить его в библиотеку, но я не до такой степени, чтобы понять, как это сделать.

Могу ли я добавить .o файл в существующую библиотеку? Как? Создать библиотеку с одним файлом? и т.д.

EDIT_2: я просто сделал

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

и все компилируется, связывается и запускается без ошибок. Должно ли это работать? После исправления логической ошибки все работает.

1 Ответ

1 голос
/ 16 февраля 2011

Это

U ds_breakdown_from_time_interval

говорит мне, что ds_breakdown_from_time_interval будет разрешено другой библиотекой во время выполнения.Итак, я предполагаю, что вам нужно связаться с библиотекой, которая определяет ds_breakdown_from_time_interval.

...