Я новичок в 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
- "U" в строке выше ... означает ли это, что библиотека была построена неправильно?
- Правильно ли я вызываю g ++?
- Нужно ли что-то вставлять в код, чтобы сказать, что я использую функции, найденные в этой библиотеке?
- Какие возможны ошибки? С чего мне начать ковыряться?
EDIT:
Ага. Библиотека DSUtils построена из нескольких источников C ++. В исходном коде есть одна программа на c, которая содержит все проблемные функции. Система Makefile вообще не работает с этим одним файлом c. Эта программа скомпилируется. В идеале, я полагаю, я бы выяснил, как изменить Makefile для компиляции этого файла и добавить его в библиотеку, но я не до такой степени, чтобы понять, как это сделать.
Могу ли я добавить .o файл в существующую библиотеку? Как? Создать библиотеку с одним файлом? и т.д.
EDIT_2: я просто сделал
g++ -o main -lDSUtils main.o my_new_objectfile.o
и все компилируется, связывается и запускается без ошибок. Должно ли это работать? После исправления логической ошибки все работает.