2013-05-24 4 views
0

-D UNICODE으로 컴파일 할 수있는 C++ 프로젝트가 있습니다. 정의 및 사용하여 객체를 보관 그런 ar.exe rcs Cpplib.a *.o두 개의 .a 파일 보관

내가 그와 함께 컴파일 : 그 정의하지 않고 컴파일

는, 내가 다음 명령을 사용하여 운영자와 아카이브 파일에 추가 오브젝트 파일들을 생성 : ar.exe rcs CpplibU.a *.o

여기서 U는 아카이브가 유니 코드 인 것을 나타냅니다.

Cpplib_x32.a Cpplib_x64.a Cpplib_x32U.a Cpplib_x64U을 : 나는 대신에 링크 할 필요없이 해당 링크 할 수 있도록

이 내가 ONE 아카이브로 .A 파일을 모두 결합 할 수있는 방법입니다. a

이제는 x32와 x64를 별도로 연결하는 것을 신경 쓰지 않지만 2 x64와 2 x32를 연결해야하는 것은 다소 짜증이납니다.

x32 및 x64 아카이브를 결합하거나 비 유니 코드 및 유니 코드 아카이브를 결합 할 수있는 방법이 있는지 알고 싶습니다. 둘 다 필요하지 않습니다. 하나 또는.

아이디어가 있습니까? 아니면 모두 4에 연결해야합니까?

+0

"* 링크하지 않아도됩니다. *"어쨌든 모든 링크를 어떻게 연결할 수 있습니까? 그들은 상호 배타적입니다, 네? 32 비트 용으로 컴파일하는 경우 64 개 컴파일로 빌드 된 라이브러리에 연결할 수 없습니다. 유니 코드 용으로 컴파일하는 경우 비 유니 코드 컴파일 된 라이브러리에 링크하는 것은 위험합니다. 릴리스 빌드에서 디버그 용으로 컴파일 된 라이브러리에 링크하거나 그 반대의 경우도 마찬가지입니다. –

+0

아니요. 나는 그들 모두에 링크되어 있고 Mingw/Codeblocks는 그것을 허용한다. 그것은 맞는 것을 사용합니다. 즉 유니 코드가없는 프로젝트를 컴파일하는 경우 Mingw은 비 유니 코드를 사용하고 exe/lib를 bloating하거나 컴파일/런타임 오류를 발생시키지 않고 다른 모든 것을 무시한다는 것을 알고 있습니다. 또한 x32/x64 것들 .. 어떻게해야할지 모르겠지만 잘 컴파일되고 실행됩니다. 단지 많은 링크를 원하지 않았습니다. 대신 네 개의 유니 코드를 포함하는 두 개 또는 네 개를 모두 포함하는 링크 . x64를 연결하지 않고 x32 프로그램을 컴파일하면 컴파일되지 않습니다. – Brandon

+0

"* 어떻게 작동하는지 모르지만 컴파일되고 실행됩니다. *"작동 방식을 모르는 경우 작동하지 않습니다. * 작동합니다. 당신이 아는 것은 당신이 그것을 시도하고 아무 것도 명백히 부러지지 않았기 때문입니다. 나는 GCC가 그것을 다룰 수 없다는 말은 아니다. 나는 다른 시스템 * # define으로 컴파일 된 코드로 링크하는 것이 일반적으로 나쁨으로 이어지는 것이 나의 경험 이었음을 말하고있다. –

답변

2

기호 이름과 개체 파일 이름이 다른 경우 적어도 자신의 라이브러리에있는 모든 32 비트 코드와 모든 64 비트 코드를 가질 수 있습니다. 물론 메이크 파일은 ASCII 대 유니 코드 변형에 대해 xxA.oxxU.o 등의 객체 파일을 쉽게 만들 수 있습니다.

기호 이름이 같은 경우 (예 : 매개 변수를 사용하지 않고 동일한 반환 유형을 사용하는 함수 또는 extern "C" 함수의 경우 매개 변수를 기반으로 이름이 변경되지 않은 함수의 경우)),이 방법을 사용하거나 [해당 함수를 제공하는 여러 라이브러리를 가질 수 없으므로 라이브러리의 전체 목록을 제공해도 작동하지 않습니다.]

+0

나는 이것을 받아 들일 것이다.하지만 내 질문은 : FooA.o와 FooU.o라는 두 파일이 있고 두 파일 모두 'void GetString (tString)'함수를 포함하고 있습니다. 여기서 tString은 #ifdef 유니 코드 문자열입니다. 예 : 유니 코드가 정의 된 경우, tstring은 std :: wstring이고 유니 코드가 정의되지 않은 경우 std :: string입니다. 해당 파일을 하나의 아카이브에 추가하고 헤더를 제공 할 수 있습니까? 예 : http://pastebin.com/xyaRLWd6 – Brandon

+1

C++에서는 이름이 다릅니다. 만약 그들이'extern "C 타입의 함수라면 링커가 먼저 찾은 것 (거의 확실하게 첫 번째 라이브러리에있는 것)을 얻을 것입니다. 하지만 C 스타일 함수의 인자로'tString'을 사용할 수는 없을 것입니다. 의심 스럽다면'nm FooA.o'를 사용하고'nm FooU.o'와 비교하여 이름이 무엇인지 확인하십시오. –