2014-04-27 2 views
0

일부 전역 정적 변수에 의존하는 C++ 코드에서 DLL lib를 빌드해야합니다. 사용자 정의 클래스의 정적 변수는 기본 형식 (int)을 갖는 변수는 그렇지 않은 반면 잘 초기화됩니다. 더군다나 이러한 변수의 값을 변경하려고하면 메모리 오류가 발생합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?C++ DLL에서 빌드 유형이있는 정적 변수가 초기화되지 않았습니다.

내가 몇 줄의 예제에서이 오류를 복제 할 수 있었다, 여기 내 코드입니다 :

mylib.hpp

#include <string> 

class AAA 
{ 
public: 
    static int    & get_static_int() { return static_int_; } 
private: 
    static int    static_int_; 
}; 

mylib.cpp

#include "mylib.hpp" 
#include <iostream> 
int    AAA::static_int_   = 42; 
class BBB 
{ 
public: 
    BBB() { std::cout << "BBB constructor!!!" << std::endl; }; 
}; 
static BBB b; 

mylib.def :

LIBRARY mylib 
EXPORTS 
    [email protected]@@0HA 

main.cp P

#include <mylib.hpp> 
#include <iostream> 
int main() 
{ 
    std::cout << "get_static_int():" << AAA::get_static_int() << std::endl; 
    AAA::get_static_int() = 10; // Exception! 
} 

경우 build.bat

cl /c mylib.cpp /I. /Fomylib.obj /MD /EHsc 
link /MACHINE:X64 /dll mylib.obj /DEF:mylib.def /out:mylib.dll msvcrt.lib kernel32.lib oleaut32.lib 
cl main.cpp mylib.lib /I. /EHsc /MD 

출력 :이 문제를 해결하지 않는 옵션을 연결하는 "_DllMainCRTStartup -entry"Loading DLL not initializing static C++ classes 및 추가 : 제가 비슷한 질문의 알고

>main 
BBB constructor!!! 
get_static_int():403973631 
<windows complain> 

문제.

C++에서 싱글 톤을 초기화하는 올바른 방법을 알고 있지만이 프로젝트의 경우 다소 큰 규모의 Linux 프로젝트를 포팅하고 수정/리팩토링해야 실용적이지 않을 것입니다.

감사합니다.

+0

def 파일없이 dllexport 및 dllimport를 사용해 보셨습니까? – cup

+0

http://demangler.com/을 통해 내보내기를 실행하면 함수가 int 및 int를 반환 할 것으로 예상되지 않아서 감사합니다. 403973631이 값 대신 메모리 위치 일 수 있습니까? –

+0

@cup dllexport를 사용해 보았는데 실제로 문제가 해결되었습니다. 하지만 원래의 코드베이스를 수정해야하기 때문에 프로젝트에서이 솔루션을 사용할 수 없습니다. 어떤 생각을 어떻게 적절한 def 파일을 만드는 방법? – WorkPerNap

답변

0

def 파일을 사용하는 것이 가장 좋은 방법은 아닙니다. dllexport를 사용하여 def 파일을 저장해야합니다. 당신이 그것을 uninline 할 필요가 있으므로이 지시되어 있기 때문에 당신이 데프 파일을 사용해야하는 경우 당신이 발견 한 것처럼

,

LIBRARY mylib 
EXPORTS 
    [email protected]@@SAAAHXZ 

에 DEF 파일을 변경, 함수는 인라인됩니다. cl 줄에/Ob0을 사용할 수는 있지만 결코 작동하지 않는다. 그래도 여전히 인라인됩니다. 예외는 계속 발생합니다. mylib.hpp는 다음 예외를 던지는없이 실행해야

class AAA 
{ 
public: 
static int    & get_static_int(); 
private: 
static int    static_int_; 
}; 

는 당신이 이런 식으로 할 경우

int& AAA::get_static_int() 
{ 
return static_int_; 
} 

을 mylib.cpp에 다음을 추가해야합니다.

+0

비 인라인 기능을 만들어 주셔서 감사합니다. 실제로 문제가 해결되었습니다! – WorkPerNap

+0

또 다른 대안은 DLL을 사용하지 않는 것입니다. 그냥 정적 라이브러리로 사용하십시오. 그렇게하면 def 파일이 필요 없습니다. – cup

관련 문제