vs2008로 빌드 된 dll을 rust에서 로드하여 사용하려고 했다.
autocxx
크레이트를 사용하여 dll의 함수의 파라미터에 사용하는 class를 정의하였고 객체를 생성했다.
그러나 생성한 객체를 파라미터로 넘겼을 때 오류가 발생하며 정상적으로 동작이 되지 않았다.
이유를 찾아보니 다음과 같았다.
동일한 문제는 아니지만 아이디어에 도움을 준 사이트이다.
https://stackoverflow.com/questions/20302891/visual-studio-2008-with-c11
vs2008에서 빌드된 dll이 vs2022에서 사용 시 완벽 호환이 되지 않는다.
주된 이유는 컴파일러 차이
와 ABI(Application Binary Interface)
불일치에서 발생한다.
vs2008
과 vs2022
은 서로 다른 ABI를 사용한다.new
와 delete
연산자가 다르게 구현될 수 있다. 이로 인해 한 컴파일러에서 동적으로 할당된 메모리를 다른 컴파일러에서 해제하려고 할 때 메모리 접근 오류나 메모리 누수가 발생할 수 있다. vs2008로 빌드된 dll은 vs2022의 콘솔어플리케이션에서 테스트를 하였다.
extern "C"
를 사용하여 c interface를 사용하면 정상 동작하였다.
문제는 파라미터로 class
객체를 넘기는 경우이다.
ABI 불일치로 인해서 ACCESS VIOLATION 에러가 계속 발생하였다.
autocxx
는 c++14을 사용했기에 MSVC9.0을 사용하는 vs2008에서 빌드 된 dll과 호환이 되지 않았던 거다.
즉, vs2022로 빌드된 dll을 사용시 정상적으로 동작이 되었다.
빌드 된 환경에 따라서 ABI
차이, 런타임 라이브러리의 차이로인해 같은 코드라도 해석이 달라질 수 있다는 것을 알았다.
앞으로 오류가 발생 시 체크할 수 있는 가능성을 하나 더 얻었다고 생각한다.