2009-11-18 2 views
7
에 컴파일 보편적 인 객체

우리는 다음과 같이 우리의 프로젝트에 대한 GCC와 미리 컴파일 된 헤더를 사용하고이를 구축되어 지금은 OSX 10.6에서 프로젝트를 빌드하고 멋진을 사용하기 위해 노력하고있어미리 컴파일 된 헤더와 OSX

gcc $(CFLAGS) precompiledcommonlib.h 

gcc $(CFLAGS) -arch i386 -arch x86_64 precompiledcommonlib.h 
Undefined symbols for architecture i386: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture i386 
collect2: ld returned 1 exit status 
Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
lipo: can't open input file: /var/folders/z1/z1A0sPkqGDyPrZWo9ysVK++++TI/-Tmp-//cc3W2gwd.out (No such file or directory) 
,536 :

gcc $(CFLAGS) -c -arch i386 -arch x86_64 commonlib.c 

그러나, 이것은 미리 컴파일 된 헤더가 작동하지 않습니다 보인다과 같이 동시에 모든 아키텍처 구축의 특징

편집 : Mark는 XCode에 따라 지적했듯이 미리 컴파일 된 헤더는 각 아키텍처마다 별도로 작성해야하기 때문에 범용 객체를 빌드 할 때 올바른 미리 컴파일 된 헤더를 gcc에 사용하도록하는 방법이 있다면 제 질문이 있습니다.

나는 XCode처럼 각 아키텍처를 완벽하게 분리 할 수 ​​있다는 것을 알고 있지만, 동시에 빌드하고 다른 빌드 구성을 사용하지 않아도된다는 장점이 있습니다.

+0

, 그리고에서에게 내가 무엇을 수집 할 수 있습니다 , 당신은 하나의 PCH 파일을 생성하지 못하고 Apple의 GCC에 두 개의'-arch' 플래그를줍니다.Qt 녀석들은이 일을하기에 이상한 일을하고있는 것 같아서, 그것을 확인하고 싶을 것입니다 ... http://qt.gitorious.org/qt/qt/merge_requests/2193 – Lucas

답변

2

방금 ​​같은 질문을하고 @lucas에서 제공하는 링크를 따라 갔기 때문에 여기에서 찾은 것을 제공 할 것이라고 생각했습니다.

주의 사항 : gcc 코드를 Linux에서 MacOS로 이식하는 경우 apple에서 제공하는 gcc 버전이 .hpp 파일 확장자를 제대로 감지하지 못합니다. 다른 답변에서 언급 한 바와 같이

mac:openstudio lefticus$ g++ test.hpp 
ld: warning: ignoring file test.hpp, file was built for unsupported file format which is not the architecture being linked (x86_64) 
Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

, 그것은 확실히 GCC는 컴파일하는 파일의 종류를 알고 만들기 위해 -x 인수를 지정하는 것이 가장 좋습니다.

g++ -x c++-header test.hpp 

이렇게하면 예상되는 test.hpp.gch가 생성됩니다.

는 명령 행에서 어떤 아키텍처를 지정할 수 있으며, GCH는

g++ -x c++-header test.hpp -arch i386 

또는

g++ -x c++-header test.hpp -arch x86_64 

개 이상의 아키텍처를 제공하는 경우

, 당신은 포스터가 언급 한 오류가 제대로 구축합니다.

mac:openstudio lefticus$ g++ -xc++-header test.hpp -arch i386 -arch x86_64 
Undefined symbols for architecture i386: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture i386 
collect2: ld returned 1 exit status 
Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
lipo: can't open input file: /var/folders/DM/DMTpbjzHHX08IEqGgEAORE+++TI/-Tmp-//ccDeWigf.out (No such file or directory) 

열쇠는 당신이 다음 컴파일하는 동안 적절한 하나를로드 할 -Xarch_ 인수를 사용하여 별도로 필요로하는 아키텍처를 컴파일하는 것입니다 : 난 그냥 동일한 작업을 수행하려고

g++ -x c++-header -arch x86_64 x86_64/test.hpp 
g++ -x c++-header -arch i386 i386/test.hpp 

g++ -arch i386 -arch x86_64 test.cpp -Xarch_i386 -Ii386 -Xarch_x86_64 -Ix86_64 
+0

우수 찾기! 고마워요! – rasmusb

3

문제점은 아키텍처가 아닙니다. 둘 다 실패합니다.

주 기능이없는 실행 파일을 빌드하려고 시도하는 중입니다.

파일 이름이 commonlib.c이므로 XCode의 라이브러리 템플릿으로 프로젝트를 시작하려면 라이브러리를 작성하고 싶습니다.

+0

시간을내어 주셔서 감사합니다. 'gcc foo.h'를 사용해보세요. 무엇이 출력됩니까? 아직도 내가 실행 파일을 만들려고한다고 생각하니? 명백한 틀린 대답은 물론 성급한 태도는 특히 매력적인 조합이 아닙니다. – rasmusb

+0

커맨드 라인을 섞어서 사용했습니다. 그러나 오류 메시지와 명령 줄은 실행 파일을 작성하려고합니다. - 왜 ld가 에러를주는 커맨드 라인입니까? 모든 플래그가 올바르도록 Xcode에서 이것을 설정합니다. 각 아키텍처마다 각 헤더를 별도로 미리 컴파일하고 명령 행에 -x 목적 -c-header -arch x86_64 Apple docs 또한 -x 매개 변수를 제안합니다. 별도의 아키텍처에 amd 세부 정보입니다. – Mark

+0

전화하세요. 주요 방법없이 프로젝트를 빌드하면 오류가 발생합니다. – surajz