Архивирование двух файлов .a

У меня есть проект C++, который можно скомпилировать с помощью -D UNICODE.

Когда я компилирую его без этого Define, он создает кучу объектных файлов, которые я затем добавляю в архивный файл .a с помощью команды: ar.exe rcs Cpplib.a *.o

Затем я компилирую его с определением и архивированием объектов, используя: ar.exe rcs CpplibU.a *.o

где U указывает, что архив является архивом Unicode.

Есть ли способ объединить оба файла .a в ОДИН архив, чтобы я мог ссылаться на него вместо того, чтобы ссылаться на:

Cpplib_x32.a Cpplib_x64.a Cpplib_x32U.a Cpplib_x64U.a

Теперь я не против привязки к x32 и x64 по отдельности, но необходимость привязки к 2 x64 и 2 x32 немного раздражает.

Я хочу знать, есть ли способ объединить архивы x32 и x64 ИЛИ объединить архивы, отличные от Unicode и Unicode. Мне не нужны оба. Либо, либо.

Любые идеи или я застрял, чтобы ссылаться на все 4?


person Brandon    schedule 24.05.2013    source источник
comment
вместо того, чтобы ссылаться на: Как вы вообще могли ссылаться на все это? Они взаимоисключающие, да? Если вы компилируете для 32-битной версии, вы не можете ссылаться на библиотеки, созданные с помощью 64-битной компиляции. И если вы компилируете для Unicode, связывание с скомпилированными библиотеками, отличными от Unicode, опасно. Например, ссылки на библиотеки, скомпилированные для отладки в сборке релиза, или наоборот.   -  person Nicol Bolas    schedule 25.05.2013
comment
Нет, сэр. Я связался со всеми из них, и Mingw/Codeblocks это позволяет. Он использует только тот, который подходит. Другими словами, если я компилирую проект без Unicode, Mingw каким-то образом знает, что нужно использовать не-Unicode и игнорировать все остальные, не раздувая мой exe/lib или не вызывая ошибок компиляции/времени выполнения. Он также делает это для x32 /x64. Я не знаю, как, но он компилируется и работает нормально.. Я просто не хотел ссылаться на такое количество.. Скорее ссылайтесь на тот, который содержит все четыре или два, которые содержат их аналоги в юникоде. . Если я скомпилирую программу x32 без компоновки x64, она не скомпилируется.   -  person Brandon    schedule 25.05.2013
comment
Я не знаю как, но он компилируется и работает отлично. Если вы не знаете, как это работает, значит, вы не знаете, что это работает. Все, что вы знаете, это то, что вы пробовали это, и, по-видимому, ничего не сломалось. Я не говорю, что GCC не может с этим справиться. Я говорю, что по моему опыту ссылка на код, скомпилированный с помощью другой системы #defines, обычно приводит к ошибкам.   -  person Nicol Bolas    schedule 25.05.2013
comment
Это опечатка. Я не мог редактировать комментарий, потому что в нем говорится, что комментарии можно редактировать только до 5-минутного маркера. Я хотел сказать: если я скомпилирую x32 без x32-библиотек, он не скомпилируется. Или, если я скомпилирую x64 без использования x64-библиотек (наоборот), он не скомпилируется. Unicode без библиотек Unicode также не будет компилироваться. Не-Unicode с библиотеками Unicode не будет компилироваться. Так что да, компилятор справляется с этим хорошо.   -  person Brandon    schedule 25.05.2013


Ответы (1)


Если имена символов и имена файлов объектов различаются, то вы можете иметь по крайней мере весь 32-битный код и весь 64-битный код в собственной библиотеке. И, конечно же, makefile может легко создать объектный файл с именами xxA.o и xxU.o или что-то подобное для варианта ASCII и UNICODE.

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

person Mats Petersson    schedule 24.05.2013
comment
Я приму это, но мой вопрос к вам, сэр: если у меня есть два файла - FooA.o и FooU.o, и оба файла содержат функцию: 'void GetString (tString)', где tString - это строка юникода #ifdef. Пример: если Unicode определен, tstring — это std::wstring, а если Unicode не определен, это std::string. Могу ли я добавить оба этих файла в один архив и просто предоставить заголовок? Пример: pastebin.com/xyaRLWd6 - person Brandon; 25.05.2013
comment
В C++ они будут иметь разные имена. Если это функции типа extern "C", то вы получите ту, которую компоновщик найдет первой [почти наверняка ту, что в первой библиотеке]. Но тогда вы, вероятно, не сможете использовать tString в качестве аргумента для функции в стиле C. Если вы сомневаетесь, используйте nm FooA.o и сравните его с nm FooU.o, чтобы узнать, что это за имена. - person Mats Petersson; 25.05.2013