일부 전역 정적 변수에 의존하는 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 프로젝트를 포팅하고 수정/리팩토링해야 실용적이지 않을 것입니다.
감사합니다.
def 파일없이 dllexport 및 dllimport를 사용해 보셨습니까? – cup
http://demangler.com/을 통해 내보내기를 실행하면 함수가 int 및 int를 반환 할 것으로 예상되지 않아서 감사합니다. 403973631이 값 대신 메모리 위치 일 수 있습니까? –
@cup dllexport를 사용해 보았는데 실제로 문제가 해결되었습니다. 하지만 원래의 코드베이스를 수정해야하기 때문에 프로젝트에서이 솔루션을 사용할 수 없습니다. 어떤 생각을 어떻게 적절한 def 파일을 만드는 방법? – WorkPerNap