2014-09-08 2 views
0

-shared 스위치를 사용하는 clang에서 -fPIC 스위치를 사용하여 컴파일 한 개체 코드가 있습니다. 나는이 모든 것을 하나의 .so 공유 객체에 링크했다. 이제이 파일을 하나의 실행 파일로 링크하고 싶습니다. 설명서 페이지에서 ld 명령과 -l 스위치를 사용하여이 작업을 수행 할 수 있어야한다고 들었습니다. 나는이 작업을 수행 할 때, 나는 다음과 같은 오류가 발생합니다 :.so 파일을 실행 파일에 연결


ld -r -L./ -l:libmymath.so simpleone 
ld: attempted static link of dynamic object `libmymath.so' 
make: *** [simpleone] Error 1 


은 내가 -dy 스위치와 같은 일을 시도했다, 그러나 그것은 나에게 같은 오류를 제공합니다. 이것이 작동하지 않는 이유를 정말로 이해하지 못합니다.

다음은이 모든 작업을 수행하기 위해 사용하는 메이크 파일입니다.

CC= clang 
LD= ld -r 
CFLAGS= -std=gnu99 -g -Oz -c 
CSECFL= -fPIC -I -L 
CFLAG3= -shared 
RM= /bin/rm -f 
OBJ= math.o my*.o 
SO= libmymath.so 

all: math my_add my_mul 

math: math.c 
    $(CC) $(CFLAGS) [email protected] $(CSECFL) 

my_add: my_add.c 
    $(CC) $(CFLAGS) [email protected] $(CSECFL) 

my_mul: my_mul.c 
    $(CC) $(CFLAGS) [email protected] $(CSECFL) 

simplemath: $(OBJ) 
    $(CC) $(OBJ) -o [email protected] 

simplemath.o: $(OBJ) 
    $(LD) $(OBJ) -o [email protected] 

lib1: my_add.o 
    $(CC) $(CFLAG3) my_add.o -o $(SO) 

lib2: $(OBJ) 
    $(CC) $(CFLAG3) my_mul.o -o $(SO) 

lib3: $(OBJ) 
    $(CC) $(CFLAG3) math.o -o $(SO) 

simpleone: $(OBJ) 
    $(LD) -L./ -l:libmymath.so [email protected] 

clean: 
    $(RM) *.o simplemath* *.t $(SO) 
+0

연결에 $ (CC)를 사용해야합니다. –

+0

사용 $ (CC)는 나에게주는
'연타 -l : libmymath.so -o simpleone libmymath.so : 그 소리 : 오류 : 링커 명령'int_mul 'int_add'로 정의되지 않은 참조 libmymath.so'에 대한 정의되지 않은 참조 종료 코드 1로 실패했습니다. (호출을 보려면 -v를 사용하십시오.) make [*** [simpleone] Error 1' . –

+0

Makefile이 완전히 엉망입니다. 어떤 파일에서 .so가 생성 되었습니까 - my_add.o, my_mul.o 또는 math.o? 이론적으로 - 그들 모두로부터, 그러나 당신이 쓴 것이 아닙니다. – keltar

답변

1

당신은 객체 (* .o 인) 정적 실행 파일이 아니라 공유 LIB (.so를) .so를가 (실행시 동적 링커에 의해 또는 dlopen을 통해 열 수 있습니다에) 전화를 연결해야합니다 .

+0

전혀 도움이되지 않습니다. 나중에 여러 파일에서이 lib 파일을 사용할 것이므로이 파일을 .so 파일로 링크해야하며이 파일이 작동하지 않는 이유를 알고 싶습니다. –

+1

정적 실행 파일에 연결하는 데 필요한 정보가 .so에 더 이상 존재하지 않기 때문에 작동하지 않습니다. 단지 수행 할 수 없습니다. 런타임 프로그램에서 사용할 공유 라이브러리와 동일한 코드를 사용하여 정적으로 링크 할 수있는 개체 집합을 만들 수 있습니다. "나중에 여러 파일에서이 lib 파일을 사용해야"하는 이유는 정적 바이너리에 객체를 연결하지 못하게합니까? – BadZen

+0

- ld 옵션에 -l 옵션을 사용하면 .so 심볼이로드되지만 정적 링크가 아닌 다른 공유 라이브러리 링크 용입니다. 런타임에 .so를 사용하고 정적 링크를 위해 .o (일반적으로 ar을 .a에 저장)를 편리하게 빌드 할 수 있습니다. 당신은 그들 사이를 "선택할"필요가 없습니다. – BadZen

관련 문제