Использование класса из другого проекта в C ++ - PullRequest
0 голосов
/ 09 июня 2011

У меня есть доступ к большому проекту C ++, заполненному файлами и с очень сложным make-файлом, предоставленным automake & friends

Вот идея структуры каталогов.

otherproject/
  folder1/
    some_headers.h
    some_files.cpp
  ...
  folderN/
    more_headers.h
    more_files.cpp

  build/
    lots_of things here
    objs/
      lots_of_stuff.o
      an_executable_I_dont_need.exe

my_stuff/
   my_program.cpp

Я хочу использовать класс из большого проекта , объявленный, скажем, "some_header.h"

/* my_program.cpp */
#include "some_header.h"

int main()
{
    ThatClass x;
    x.frobnicate();
}

Мне удалось скомпилировать мой файл, кропотливо передавая множество символов "-I"опции для gcc, чтобы он мог найти все файлы заголовков

g++ my_program.cpp -c -o myprog.o -I../other/folder1 ... -I../other/folderN

Когда дело доходит до компиляции, я должен вручную включить все его ".o", что, вероятно, излишне

g++ -o my_executable myprog.o ../other/build/objs/*.o 

Однако я не только должен делать такие вещи, как ручное удаление его «main.o» из списка, но этого даже недостаточно, поскольку я забыл также ссылаться на все библиотеки, которые он использовал.

otherproject/build/objs/StreamBuffer.h:50: undefined reference to `gzread'

В этот момент я начинаю чувствовать, что, возможно, я делаю что-то очень неправильное. Как мне поступить?Что является обычным и как лучше всего подойти к такого рода проблемам?


Мне нужно это для работы на Linux на случай, если нужно будет что-то сделать для конкретной платформы.

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

Как правило, файлы .o проекта должны быть сгруппированы в библиотеку (в Linux файл .a, если это статическая библиотека, или .so, если это динамическая библиотека), и вы ссылаетесь на библиотеку, используяПараметр -L для указания местоположения и параметр -l для указания имени библиотеки.

Например, если файл библиотеки имеет значение /path/to/big_project/libbig_project.a, вы добавите параметры -L /path/to/big_project -l big_project в свой gccкомандная строка.

Если у проекта нет файла библиотеки, на который вы можете ссылаться (например, это не библиотека, а исполняемая программа, и вам просто нужен некоторый код, используемыйисполняемой программы), вы можете попробовать попросить автора проекта создать такой файл библиотеки (если он / она знакомы с «automake и друзьями», для него это не должно быть слишком большой проблемой), или попробуйте сделать это самостоятельно.

РЕДАКТИРОВАТЬ Еще одно предложение: вы сказали, что проект поставляется с make-файлом.Попробуйте make сделать это с make-файлом и посмотреть, как выглядит его командная строка компилятора.Есть ли в нем много включений и отдельных объектных файлов?

1 голос
/ 09 июня 2011

Рассматривать приложение, которое не было разработано как библиотеку, как если бы оно было библиотекой, вряд ли будет работать. В качестве необязательного примера, пропуск main может привести к отключению кода инициализации, от которого зависит нужный класс.

Ответственное, что нужно сделать здесь, это прочитать код, понять его и превратить нужные функции в нужную библиотеку. Создайте «исполняемый файл, который вам не нужен» с помощью символов отладки и установите точки останова в конструкторах и методах класса. Вступите в них, чтобы вы поняли функциональность и какие части программы имеют отношение и не имеют отношения к вашим потребностям.

Надеюсь, код находится под какой-то системой контроля версий, которая поддерживает ветвление (например, Git). Если нет, создайте свой собственный репозиторий, который это делает. Редактируйте файлы, пока вы не организуете их в библиотеку и код, который использует библиотеку. Убедитесь, что он работает правильно в контексте исходной программы. Затем развернитесь и используйте эту библиотеку в своей программе.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...