Включение библиотеки при компиляции - PullRequest
0 голосов
/ 12 декабря 2011

Сначала Справочная информация : Ubuntu 10.10, gcc 4.4.5, C ++, Qt Creator 2.3.1, FLANN.

Проблема : Каждый раз, когда я компилирую свой код, я получаю сообщение об ошибке «неопределенная ссылка на [функцию из FLANN]».

Объяснение : Я работал над графическим интерфейсом в Qt Creator, который будет использовать несколько созданных мной классов, которые включают ссылки на библиотеку FLANN (необязательно, что важно знать). Конечно, все шло гладко, пока я не включил эти классы и их заголовочные файлы. Я добавил библиотеку в файл .pro на всякий случай, но это не решило мою проблему. Я сузил ситуацию до того, как Qt создает файлы по сравнению с тем, как я делал файлы, когда тестировал свои классы с помощью Makefile:

Мой Makefile: g ++ -g process_stuff.o driver.o -o test.exe /usr/local/lib/libflann_s.a

Я добавляю эту библиотеку в конец команды gcc, и она отлично работает. Более того, если я удаляю /usr/local/lib/libflann_s.a, я получаю ту же ошибку, что и сам, как и из Qt.

Вопрос : Что именно я делаю, включая библиотеку в конце моих вызовов gcc, и что я могу сделать, чтобы это произошло в Qt Creator? Вся помощь приветствуется, и спасибо заранее.

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

Короткий ответ на то, что вы делаете, добавляя библиотеку в конце команды gcc, говорит системе сборки, где она может найти библиотеку и какую библиотеку вы хотите связать с вашим кодом. Часть -L указывает путь к библиотекам, а -l - это имя библиотеки, с которой вы хотите связать. Я подозреваю, что оба они не включены в ваш файл проекта Qt, поэтому он не собирается, когда вы запускаете его нормально. Вы можете добавить два в проекте как:

    INCLUDEPATH += $$quote(/usr/local/include)
    LIBS += $$quote(-lflann_cpp_s) \
        $$quote(-L/usr/local/lib/)
1 голос
/ 13 декабря 2011

Внешние библиотеки обычно предоставляются в двух формах: статические библиотеки и разделяемые библиотеки. Статические библиотеки - это файлы .a. Когда программа связана со статической библиотекой, машинный код из объектных файлов для любых внешних функций, используемых программой, копируется из библиотеки в конечный исполняемый файл.

0 голосов
/ 28 декабря 2011

Но через несколько мгновений .... unix:! Macx:! Symbian: LIBS + = -L $$ PWD /../../../../ usr / local / lib / -lflann_cpp_s После исправления этого to: unix:! macx:! symbian: LIBS + = -L $$ PWD /../../../../ usr / local / lib / -lflann_s

Мастер библиотеки Qt решил включить не тот файл в качестве библиотеки. После изменения файла все работает.

...