2014-09-12 5 views
3

공유 라이브러리 libA.so을 성공적으로 생성했습니다.
내부의 모든 클래스는, namspace 일반적인 가지고 ::공유 라이브러리를 서로 공유 라이브러리 공유 C++

ldd libA.so 
linux-vdso.so.1 => (0x00007fffd632d000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6497d19000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6497b03000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6497743000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6497447000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f6498243000) 

을 그럼, 다른 라이브러리를 만들 필요가, B, 그건 그래서 내가 그것을 연결도 (샹그릴라와 -L < path_to_A>)와 A.를 사용 _I /로 컴파일하십시오. 내부 모든 클래스는, 일반적인 namspace :: B

컴파일을 가지고 libB.so 만들지 만 :

Multiple markers at this line 
- Symbol '<A_method>' could not be resolved 
- Function '<A_method>' could not be resolved 
:

1) Elipse 내가이 메소드를 호출 코드에서 빨간색 X를 넣어

ldd libB.so 
linux-vdso.so.1 => (0x00007fffbcbfe000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f695ca59000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f695c842000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f695c483000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f695bf7e000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f695d1d9000) 
:

2) 도서관 A는 B에 연결되지 않은 것 같다

libA.so => ..... 

모든 아이디어 : 나는에 대한 링크가없는 이유

나는 이해할 수 없다?

갱신

이 (일식에 의해 자동 생성) 메이크입니다 : 당신이 Makefile을 사용하는 경우

-include ../makefile.init 

RM := rm -rf 

# All of the sources participating in the build are defined here 
-include sources.mk 
-include src/network/mqtt/subdir.mk 
-include src/data/subdir.mk 
-include subdir.mk 
-include objects.mk 

ifneq ($(MAKECMDGOALS),clean) 
ifneq ($(strip $(CC_DEPS)),) 
-include $(CC_DEPS) 
endif 
ifneq ($(strip $(C++_DEPS)),) 
-include $(C++_DEPS) 
endif 
ifneq ($(strip $(C_UPPER_DEPS)),) 
-include $(C_UPPER_DEPS) 
endif 
ifneq ($(strip $(CXX_DEPS)),) 
-include $(CXX_DEPS) 
endif 
ifneq ($(strip $(CPP_DEPS)),) 
-include $(CPP_DEPS) 
endif 
ifneq ($(strip $(C_DEPS)),) 
-include $(C_DEPS) 
endif 
endif 

-include ../makefile.defs 

# Add inputs and outputs from these tool invocations to the build variables 

# All Target 
all: libB.so 

# Tool invocations 
libB.so: $(OBJS) $(USER_OBJS) 
    @echo 'Building target: [email protected]' 
    @echo 'Invoking: GCC C++ Linker' 
    g++ -L/path_where_is_A_so/ -shared -o "libB.so" $(OBJS) $(USER_OBJS) $(LIBS) 
    @echo 'Finished building target: [email protected]' 
    @echo ' ' 

# Other Targets 
clean: 
    -$(RM) $(LIBRARIES)$(CC_DEPS)$(C++_DEPS)$(C_UPPER_DEPS)$(CXX_DEPS)$(OBJS)$(CPP_DEPS)$(C_DEPS) libB.so 
    [email protected] ' ' 

.PHONY: all clean dependents 
.SECONDARY: 

-include ../makefile.targets 
+0

나는 그것을 즉시 닫을 뜻은 아니며 단지 그것이 중복임을 제안했습니다. 질문에 답변하지 않는다고 생각하시면 의견을 보내 주시면 다시 열어 드리겠습니다. – MByD

+0

나는 같은 경우가 아니라고 생각한다. 나는 정적 라이브러리 (.a)와 공유 라이브러리 (.so)로 작업하고있다. –

+0

그것은 공유 라이브러리와 정적 라이브러리 모두에서 작동한다. 시도해 보라. – MByD

답변

1

당신의 libB 사용하지 않는 경우 libA에있는 것이 있으면 링커는 libA에 대한 링크를 버릴 수 있습니다 (링커 ​​플래그 --as-needed이 툴 체인의 기본값인지 여부에 따라 다름)

libB를 libA에 강제로 연결하려면 -Wl,--no-as-needed 플래그를 -lA 앞에 표시하도록 지정하십시오.

-1

다음과 같은 일을 할 :

xxxxxx_la_SOURCES = $(FILES) 
xxxxxx_la_CFLAGS = $(CFLAGS) 
xxxsxx_la_LDFLAGS = $(location_of_so_file) 
+1

그건 Automake ... – DevSolar

+0

내 메이크 파일은 Eclipse에 의해 자동으로 생성됩니다. 그래서, 프로젝트 설정에서이 값을 설정할 수있는 곳을 찾아야합니다 .. –

+0

@Velthune : 신경 쓰지 마세요, GNU Automake가 마술 한 것입니다. 나는 이클립스 CDT가 같은 메카닉을 사용하는지는 의심 스럽다. (틀릴 수도 있지만 둘 중 하나를 사용하지 않는다.) – DevSolar

관련 문제