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.cpp 및 TestVariable.cpp에서 생성됩니다.
누군가 도와 드릴 수 있습니까? 대답은 얼굴에서 나를 빤히 쳐다 보면서 맹세 할 수는 있지만 나는 그것을보고 있지 않습니다.
미리 감사드립니다.
[공유 객체는 메인 바이너리의 심볼을 찾을 수 없습니다 (C++)] (http://stackoverflow.com/questions/3623375/shared-object-cant-find-symbols-in-main-binary-c)) – AProgrammer
참조 http://stackoverflow.com/questions/3623375/shared-object-cant-find-symbols-in-main-binary-c – AProgrammer
이것은 이상하게 보입니다. 일반적으로 라이브러리는 자체 충분한 스냅인입니다. 라이브러리 객체에 기호가 있는지 찾아 볼 수 있습니다. –