공유 정적 라이브러리를 사용하는 xcode에서 "중복 기호" 오류를 방지하려면 어떻게 해야 합니까?
정적 라이브러리 A, B, C를 Xcode 프로젝트로 정리했습니다.A와 B는 C에 의존합니다.A와 B에 의존하는 아이폰 프로젝트를 만들 때 A와 B에 중복 기호(C에서)가 검출되었다는 링커 오류가 발생합니다.이러한 오류를 겪지 않고 다른 Xcode 프로젝트에 포함할 수 있도록 이 세 개의 정적 라이브러리를 어떻게 구성할 수 있습니까?
칼의 대답은 옳지만 잘못된 이유로: 정적 라이브러리를 서로 연결하는 것은 잘못된 것이 아닙니다. 칼의 샘플을 사용하는 것을 볼 수 있습니다.Carl의 샘플 코드를 설정한 후 다음 작업을 수행합니다. (XCode에서 사용하는 것이기 때문에 libtool을 사용합니다.)
neutron:libtest jamie$ libtool -o a2.a a.a c.a
neutron:libtest jamie$ libtool -o b2.a b.a c.a
neutron:libtest jamie$ gcc main.o a2.a b2.a -o app2
neutron:libtest jamie$ ./app2
a
c
b
c
neutron:libtest jamie$
이것은 a2.a와 b2.a를 main.o와 연결합니다.칼에 따르면, 이것이 OPs 문제의 근원이고, app2는 링크하면 안 된다고 합니다.하지만 물론 그렇습니다.링커는 동일한 파일의 두 인스턴스를 무시할 수 있을 정도로 똑똑합니다.a2.a와 b2.a 모두 co를 포함하고 있음을 알 수 있습니다.
neutron:libtest jamie$ ar -t a2.a
__.SYMDEF SORTED
a.o
c.o
neutron:libtest jamie$ ar -t b2.a
__.SYMDEF SORTED
b.o
c.o
하지만 잘 연결됩니다.
문제는 유니버설 바이너리, PPC/x86 유니버설 바이너리, 또는 armv6/armv7 아이폰 유니버설 바이너리와 연결되어 있다는 것입니다.여기서 문제가 되는 것은 카테고리에 버그가 있다는 것이며 수정(linker flags에 -all_load 추가)은 단일 아키텍처에만 적용되는 수정입니다.-all_load를 사용하면 여러 아키텍처에 대해 정의된 기호를 무시하는 링커 기능이 중단되고 중복된 기호 오류가 발생합니다.
여기에 -all_load를 사용하는 것보다 더 나은 솔루션을 포함하여 작성했습니다.
사용에 대한 대안-all_load사용하는 것입니다-force_load필요한 라이브러리에만 "path_to_lib"이 적용됩니다.예를 들어 다음과 같은 것을 사용할 수 있습니다.-force_load "$(PROJECT_DIR)/libname".
이렇게 하면 구현 파일을 수정해야 하는 Jamie의 솔루션에 필요한 작업을 피할 수 있습니다.
320 프로젝트에서 채택한 솔루션은 다음과 같습니다. http://groups.google.com/group/three20/browse_thread/thread/ec208be4ff8b4dcb/0dccf992a26850df
edit: Xcode 4.3 시점에서 필요성-all_load그리고.-force_load제거되었습니다.지금만-ObjC필요합니다.자세한 내용은 https://stackoverflow.com/a/2615407/211292 을 참조하십시오.
이 문제는 반드시 Xcode나 Objective-C와 관련된 것은 아닙니다.라이브러리를 다른 라이브러리에 연결/보관하지 마십시오.A&B는 최종 링크 시간에만 C에 의존하며, 구축 시에는 의존하지 않습니다.원하는 항목:
- A를 짓다
- B를 짓다
- C를 짓다
- 빌드 앱 & 링크
다음은 제가 시연하기 위해 만든 프로젝트의 예시입니다.
파일 만들기:
app: main.o a.a b.a c.a
gcc $^ -o $@
%.o: %.c
gcc -Wall -c $^
%.a: %.o
ar -r $@ $^
clean:
rm -rf *.o *.a app
a.c:
#include <stdio.h>
void c(void);
void a(void)
{
printf("a\n");
c();
}
b.c:
#include <stdio.h>
void c(void);
void b(void)
{
printf("b\n");
c();
}
c.c:
#include <stdio.h>
void c(void)
{
printf("c\n");
}
main.c:
#include <stdio.h>
void a(void);
void b(void);
int main(int argc, char *argv[])
{
a();
b();
return 0;
}
로그 작성 및 실행:
$ make
gcc -Wall -c main.c
gcc -Wall -c a.c
ar -r a.a a.o
ar: creating archive a.a
gcc -Wall -c b.c
ar -r b.a b.o
ar: creating archive b.a
gcc -Wall -c c.c
ar -r c.a c.o
ar: creating archive c.a
gcc main.o a.a b.a c.a -o app
rm a.o b.o c.o
$ ./app
a
c
b
c
언급URL : https://stackoverflow.com/questions/2300867/how-can-i-avoid-duplicate-symbol-errors-in-xcode-with-shared-static-libraries
'programing' 카테고리의 다른 글
| Vulkan: What is the point of sType in vk*CreateInfo structs? (0) | 2023.10.01 |
|---|---|
| 입력 시 ng-click 동작 방지 (0) | 2023.10.01 |
| Git은 왜 제 마스터 지점이 "이미 최신"이 아니라고 합니까? (0) | 2023.10.01 |
| display 추가 방법: jQuery show() 기능에서 inline-block? (0) | 2023.10.01 |
| npm WARN old lock file package-lock.json 파일이 이전 버전의 npm으로 생성되었습니다. (0) | 2023.10.01 |