2015-01-23 24 views
1

C++로 작성된 lib (.so)가 있습니다. 내가 nm mylib.so 일 경우 00000000000029a0 T _ZN4Bits7fromMemEPhl을 얻습니다.C 응용 프로그램에 의해로드 된 C++ 플러그인의 C++ 라이브러리 사용

반면에 C로 작성된 앱이 있는데, C++로 작성된 일부 플러그인을로드합니다 (dlopen, dlsym 등).

내 C++ 플러그인에서 내 lib를 사용하려고하면 undefined symbol: _ZN4Bits7fromMemEPhl이 표시됩니다. 왜?

편집 :

$(PLUGINS_DIR)/%.so: $(PLUGINS_DIR)/%.o 
    $(CXX) $^ -o [email protected] -shared 

$(PLUGINS_DIR)/%.o: $(PLUGINS_DIR)/%.cpp 
    $(CXX) -c $< -o [email protected] -g -Wall -std=c++11 -pedantic -lcpp-bitstring -fPIC -I.,-rpath=$(LIBS_DIR)/cpp-bitstring 

그리고 이것이 내가 내 주요 응용 프로그램을 컴파일 방법은 다음과 같습니다 :

이 내 플러그인을 컴파일하는 방법이다

$(TARGET): $(TARGET).o 
    $(CC) -o [email protected] $^ -g -Wall -std=gnu99 -ldl -lcrypto -Wl,--export-dynamic 

편집 : 문제

분명하다. 어떤 이유로 내 라이브러리 (cpp-bitstring)가 내 플러그인에 연결되어 있지 않습니다. 누락 된 코드는 어디에 있습니까?

+0

여기

간단한 메이크입니다 올바르게로드 되었습니까? – jxh

+0

@jxh 필자는 플러그인 코드에있는로드와 "do_stuff"함수에 간단한 cout을 넣었고, 콘솔에서 그 출력을 보았습니다. 그래서 플러그인의 로딩/실행이 정상적으로 작동한다고 가정합니다. – alexandernst

+0

'정의되지 않은 심볼'메시지는 어느 시점에서 인쇄됩니까? – jxh

답변

1

공유 객체를 만들 때 플러그인을 동적으로로드 할 때 라이브러리를 가져 오려면 라이브러리 종속성을 제공해야합니다.

plugin.o:  CXXFLAGS += -fPIC 
main: LDFLAGS += -ldl 
all: main plugin.so 

plugin.so:  plugin.o 
     $(CXX) $^ -o [email protected] -shared -lreadline 

main.c 파일은 다음과 같습니다 :

#include <dlfcn.h> 
#include <assert.h> 

int 
main (void) 
{ 
    void *p = dlopen("./plugin.so", RTLD_NOW); 
    assert(p); 
    void (*do_stuff)(void) = dlsym(p, "do_stuff"); 
    assert(do_stuff); 
    do_stuff(); 
    dlclose(p); 
    return 0; 
} 

그리고 plugin.cpp 파일은 다음과 같습니다 당신이 당신의 플러그인을 확인 했는가

#include <iostream> 
#include <stdlib.h> 
#include <readline/readline.h> 

extern "C" void do_stuff (void) { 
    while (char *s = readline("> ")) { 
     std::cout << "- " << s << std::endl; 
     free(s); 
    } 
    std::cout << std::endl; 
} 
+0

'$ (CXX) $^-o $ @ -shared -lcpp-bitstring'을 시도했지만 불평을했습니다. 도서관을 찾을 수 없다는 것에 관한 이야기. 라이브러리가 어디에 있는지'ld'라고 어떻게 말할 수 있습니까? ', -rpath = $ (LIBS_DIR)'을 붙이는 것은 도움이되지 않습니다. – alexandernst

+0

'-lcpp-bitstring'에'-L/where/the/library/is'를 붙이십시오. – jxh

+0

나는 거의 다 왔어.'$ (CXX) $^-o $ @ -shared -L $ (LIBS_DIR)/cpp-bitstring -lcpp-bitstring'은'ldd plugin.so'가'libcpp-bitstring'에 링크되어 있음을 보여줍니다. 그것은 그것을 찾을 수 없다고 말합니다. 어떻게 그것을 찾고 있는지 확인할 수 있습니까? – alexandernst