2013-12-17 6 views
2

나는 또한 내가 만든 라이브러리를로드하는 C++ 주요 응용 프로그램을 만들었습니다. 두 원본 모두 공통 헤더 (TestFlags.h)를 공유합니다. TestFlags.h 안에 클래스와 포인터 선언은 메인 애플리케이션의 인스턴스를 정의하고 라이브러리 함수 내에서 사용하는 전체 애플리케이션에 대해 전역 적으로 사용하도록되어 있습니다. dlopen on Android ndk

class TestFlags { 
public: 
    TestFlags() : behaviour(1) 
     {} 
    int behaviour; 
}; 

extern __attribute__ ((visibility("default"))) TestFlags * gpTestFlags; 

다음 실행 단계의 시퀀스가 ​​지정된 목표를 달성하기 위해 다음과 같습니다

  1. 메인 애플리케이션 TestFlags ---> gpTestFlags = 새로운 TestFlags의 새로운 인스턴스를 생성한다();
  2. 메인 프로그램 라이브러리 ---> dlopen을 (library.so, RTLD_LAZY | RTLD_GLOBAL)로드
  3. 이전의 예를 사용하여 라이브러리 안에있는 함수를 호출 선언 ---> gpTestFlags-> 동작 = 2; gpTestFlags 라이브러리 gpTestFlags 인스턴스 내부에 어떤 이유로 보이지 않는 것 같다

NULL 때문에 분할 오류 :

  • 은 SIGSEGV를 받았습니다. 다른 정적 클래스에도 동일한 문제가 발생합니다.이 값은 라이브러리 내부에는 보이지 않는 기본 응용 프로그램에 구성됩니다.

    내가 연구 할 수있는 한, 라이브러리는 복제 된 것처럼 선언문에 완전히 다른 메모리 공간을 관리하는 것으로 보인다.

  • 답변

    1

    dlopen()이 작동하는 예상되는 방법입니다.

    두 모듈에는 gpTestFlags이라는 전역 심볼이 있습니다. 링크를 함께 연결하려고하면 링커가 중복에 대해 비명을 지르는 것입니다.

    라이브러리의 포인터를 weak로 선언하거나 dlsym()을 사용하여 프로그래밍 방식으로 연결을 해결할 수 있습니다.

    +0

    불행히도 코드는 크로스 플랫폼을위한 것입니다. Windows에서 정확히 LoadLibrary 및 __attribute __ ((visibily ("default"))와 __declspec (dllimport/dllimport)을 사용하여 dlopen을 변경하면됩니까 – walter

    +0

    내가 언급 한 또 다른 사항은 Android 용 dlopen 소스 코드를 살펴 보는 것입니다 flag 매개 변수를 무시합니다. – walter