Проблема с компоновкой при создании разных двоичных файлов - PullRequest
0 голосов
/ 30 августа 2010

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

dir1 / xxx.h

class ABC{

public:

int init();
};

dir1 / xxx.cpp

ABC::init()

Аналогично

У dir2 есть собственная копия.

Проблема заключалась в том, что разработчики хотели сохранить разные версии - первичные, потому что они должны знать, когда нужно вызывать исходный код в dir1 или dir2, который не зависит от модификаций для каждой.

Теперь наша проблема в том, как мы связываем код в нашем двоичном файле. Соответствующий заголовочный файл условно компилируется с использованием той же директивы включения #ifndef .. #define .. #endif. Заголовочные файлы архивируются в lib1.a lib2.a и так далее. Следовательно, когда мы связываем нашу библиотеку и, в случае необходимости, мы запрашиваем ее из lib3.a во время компоновки, мы должны убедиться, что она связывает первую:

ldd .. lib1.a lib2.a lib3.a - поэтому точный заголовок не связывается должным образом. Обратите внимание, что все .a имеют некоторые дополнительные интерфейсы, скомпилированные и связанные.

К сожалению, требуемый заголовок содержит общее объявление (определяет те же методы, но немного отличаются)

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

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

Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 15 сентября 2010

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

0 голосов
/ 30 августа 2010

Существует несколько подходов к совместному использованию кода между разработчиками:

  1. Пусть все используют один и тот же код. Сделайте группу ответственной за общий код, и, если они вносят изменения в общий код, убедитесь, что эти изменения (например, дополнительный аргумент для метода) «распространяются» на все приложения, использующие общий код.

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

    В этом подходе вы все еще можете распределять общий код в виде LIB или DLL.

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

    Кроме того, назначьте задачу «Менеджер интеграции» члену каждой группы приложений. Он / она будет отвечать за перенос новых версий общего кода, от центральной версии до локальной копии. Он / она будет необходимо внести изменения в приложение, чтобы убедиться, что приложение по-прежнему работает с новой копией, и убедиться, что приложение повторно протестировано с новой версией общего кода.

...