2011-03-11 2 views
2

C++에서 동적으로 정의 된 전역 변수를 동적 라이브러리에서 액세스 할 수 있습니까?C++에서 동적으로 정의 된 전역 변수를 동적 라이브러리에서 액세스 할 수 있습니까?

다음과 같이 헤더 파일에 선언 된 전역 변수가 있습니다.

파일명 : 다음 TestVariable.hpp 다음

#ifndef TESTVARIABLE_HPP 
#define TESTVARIABLE_HPP 

extern 
int testVariable; 

#endif 

및 소스 코드 파일에 정의;

파일명 : TestVariable.cpp

int testVariable; 

다음과 같이 내 동적 라이브러리가 포함하는 소스 코드;

파일명 : Plugin.cpp 내 주요 기능이 후 다음과 같이 정의된다

#include <TestVariable.hpp> 

#ifdef __cplusplus 
extern "C" { 
#endif 

void * 
__attribute__((constructor)) 
loadLibrary 
(
void 
) 
{ 
    testVariable = 100; 
} 

void * 
__attribute__((destructor)) 
unloadLibrary 
(
void 
) 
{ 
} 

#ifdef __cplusplus 
} 
#endif 

;

파일 이름 : MAIN.CPP

#include <iostream> 
#include <dlfcn.h> 
// dlopen 
#include <TestVariable.hpp> 

using std::cout; 
using std::endl; 

int main(void) 
{ 
    void * libHandle_p = NULL; 


    cout << "Test variable = " << testVariable << endl; 

    // Load the dynamic library. 

    libHandle_p = dlopen("./.libs/libPlugin.so", RTLD_LAZY); 

    if (libHandle_p == NULL) 
    { 
     cout << "Error loading library" << endl; 
     return(-1); 
    } 

    cout << "Test variable = " << testVariable << endl; 
    return(0); 
} 

내가 컴파일하고 GNU Autotools입니다 g ++ 및 LD를 사용하여 (어떤 경고없이) 올바르게 모든 코드를 링크 할 수 있지만을 나는 결과 바이너리 실행 파일을 실행할 때 동적 라이브러리 파일을 dlopen 할 수 없습니다. 그러나 함수의 본문을 구성하는 유일한 코드 줄을 주석으로 처리하고 loadLibrary을 다시 컴파일 한 다음 다시 컴파일하면 프로그램이 제대로 작동합니다! 내가 더 잘 알고하지 않은 경우

, 나는 dlopen을가 그것 (라이브러리)에 호출 될 때 라이브러리가 전역 변수 testVariable에 해당 참조를 해결할 수 있다고 말하고 싶지만이는 dlopen이 원인이되는 것입니다 작동이 실패합니다. 링키지 유형 및/또는 이름 맹 글링이이 문제와 관련이 있습니까?

생성 된 동적 라이브러리에서 Linux nm 유틸리티를 실행하면 심볼 testVariable이 정의되지 않았 음을 알려줍니다 (예 : "U"). 바이너리 실행 파일에서 nm 유틸리티를 실행하면 심볼 testVariable이 존재하며 초기화되지 않은 데이터 섹션 즉, "B"내에 있다는 것을 알려줍니다. 그렇다면 동적 라이브러리를로드 할 때이 심볼을 dlopen으로 해결할 수없는 이유는 무엇입니까?

소스 파일 Plugin.cpp에서 동적 라이브러리 만 생성합니다. 이진 실행 파일은 두 소스 코드 파일 main.cppTestVariable.cpp에서 생성됩니다.

누군가 도와 드릴 수 있습니까? 대답은 얼굴에서 나를 빤히 쳐다 보면서 맹세 할 수는 있지만 나는 그것을보고 있지 않습니다.

미리 감사드립니다.

+0

[공유 객체는 메인 바이너리의 심볼을 찾을 수 없습니다 (C++)] (http://stackoverflow.com/questions/3623375/shared-object-cant-find-symbols-in-main-binary-c)) – AProgrammer

+0

참조 http://stackoverflow.com/questions/3623375/shared-object-cant-find-symbols-in-main-binary-c – AProgrammer

+0

이것은 이상하게 보입니다. 일반적으로 라이브러리는 자체 충분한 스냅인입니다. 라이브러리 객체에 기호가 있는지 찾아 볼 수 있습니다. –

답변

2

나는 내 자신의 문제를 해결 한 것 같습니다.바이너리 실행 파일 (동적 라이브러리가 아님)을 컴파일 할 때 GNU g ++ 컴파일러에 다음 인수를 전달하면 문제가 해결되었습니다. 는 동적 기호 테이블에 기호 testVariable을 추가 링커를 강제하고, LD (는 GNU 링커)에 대한 man 페이지에 따르면, 동적 기호 테이블 기호 세트를 포함하고 있기 때문에

-Wl,--export-dynamic 

그것은 작동 동적 객체 (이 경우에는 my library)에서 런타임에 볼 수 있습니다.

불편을 끼쳐 드려 죄송합니다.

관련 문제