Добавление объектных (.o) файлов в проект qtcreator
Как добавить сторонние файлы.o и.h в проект Qt C++ в QtCreator? Я хочу добавить некоторые скомпилированные файлы.o из John The Ripper в мой тест (не обращайте внимания на неплатежеспособность). В качестве теста автор написал небольшую C-программу (вне QtCreator) и связал ее с common.o
а также MD5_std.o
и это работало нормально; Я могу просто сделать gcc -o runme common.o MD5_std.o simpleprogram.c
, но с QtCreator, кажется, ничего не работает. Я продолжаю получать неопределенные ссылки.
Я попытался добавить это в файл.pro:
LIBS += "$$_PRO_FILE_PWD_/common.o" "$$_PRO_FILE_PWD_/MD5_std.o"
И это:
LIBS += /full/path/to/common.o /full/path/to/MD5_std.o
Я тоже пробовал настройку INCLUDEPATH
и добавление файлов.o в качестве "других файлов" и "источников" в файл.pro, но независимо от того, что я делаю, вызовы функций в файлах.o всегда приводят к неопределенным ссылкам.
Кроме того, из всех советов, которые я нашел в интернете (что сработало для них, как ни странно), я не нашел способа добавить файлы.o в проект таким образом, чтобы они копировались в теневую сборку. каталог и ссылки оттуда. Я, кажется, неправильно ссылаться на $$_PRO_FILE_PWD_
,
Кстати, то, что я получил на работу, это привязка системной библиотеки. Когда я добавлю -lcrypt
в LIBS
и включать unistd.h
Я могу нормально вызывать функцию crypt.
1 ответ
Судя по вашим комментариям, у вас как минимум две проблемы:
1) Вам нужно использовать переменную OBJECTS в qmake, чтобы выполнить вашу операцию с -o
аргумент gcc. Здесь вы можете найти документацию этого:
Эта переменная автоматически заполняется из переменной SOURCES. Расширение каждого исходного файла заменяется на.o (Unix) или.obj (Win32). Вы можете добавить объекты в список.
Исходя из этого, вы бы написали что-то вроде этого:
OBJECTS += common.o MD5_std.o
Обратите внимание, что вам также нужно будет использовать спецификацию связывания "extern C", чтобы избежать искажения имени. Это необходимо, чтобы иметь возможность ссылаться при использовании стороннего объекта из кода C и такой компиляции. Вам нужно написать это для соответствующих функций C:
extern "C"
{
...
}