2013-05-24 2 views
0

У меня есть проект на C++, который можно скомпилировать с помощью -D UNICODE.Архивирование Два файла .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 или объединить архивы Un-Unicode и Unicode. Мне не нужны оба. Или, Или.

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

+0

"* вместо того, чтобы ссылаться на: *" Как вы могли бы соединить все это? Они взаимоисключающие, да? Если вы компилируете 32-разрядную версию, вы не можете ссылаться на библиотеки, созданные с помощью 64-компиляции. И если вы компилируете для Unicode, ссылка на некомбинированные библиотеки Unicode опасна. Как ссылка на библиотеки, скомпилированные для отладки в сборке релиза или наоборот. –

+0

Нет, сэр. Я связываюсь со всеми, и Mingw/Codeblocks позволяет это. Он использует только тот, который подходит. Другими словами, если я компилирую проект без Юникода, Mingw каким-то образом знает, что использует Un-Unicode, и игнорирует остальные все без раздувания моих exe/lib или метаданных компиляции/ошибок выполнения. Это также делает это для x32/x64. Я не знаю, как, но он компилируется и работает просто отлично. Я просто не хотел ссылаться на это много. Скорее ссылка на ту, которая содержит все четыре в ней или два, которые содержат их юникодные копии , Если я скомпилирую программу x32 без ссылки на x64, она не будет компилироваться. – Brandon

+0

"* Я не знаю, как, но он компилируется и работает просто отлично. *« Если вы не знаете, как это работает, то вы не знаете, что * это работает. Все, что вы знаете, это то, что вы это пробовали, и ничто, по-видимому, не сломалось. Я не говорю, что GCC не может справиться с этим. Я говорю, что мой опыт заключался в том, что ссылка на код, который был скомпилирован с помощью * разных * системных '# define', обычно приводит к плохому. –

ответ

2

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

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

+0

Я согласен с этим, но мой вопрос для вас сэр: Если у меня есть два файла - FooA.o и FooU.o, и оба файла содержат функцию: 'void GetString (tString)', где tString - строка unicode #ifdef. Пример: если unicode определен, tstring - std :: wstring, и если Unicode не определен, его std :: string. Могу ли я добавить оба этих файла в один архив и просто поставить заголовок? Пример: http://pastebin.com/xyaRLWd6 – Brandon

+1

В C++ у них будут разные имена. Если они являются «внешними» функциями типа «C», вы получите то, что сначала найдет компоновщик [почти наверняка тот, что в первой библиотеке]. Но тогда вы, вероятно, не можете использовать 'tString' в качестве аргумента для функции стиля C. Если вы сомневаетесь, используйте 'nm FooA.o' и сравните его с' nm FooU.o', чтобы узнать, что такое имена. –

Смежные вопросы