C++ DLL 개발 관련해서 궁금한게 있습니다.

안녕하세요…!
닷넷 커뮤니티에 질문하기 적절한지 모르겠지만… 저한테 제일 친숙하고 업계 분들도 많은걸로 알고 있어서 여기에 질문하게 되었습니다.

최근에 제가 배속된 팀에서 자사 솔루션을 DLL 형태의 SDK로 제공하는 프로젝트를 진행하려는 중인데요, 아마도 제가 개발의 많은 부분을 담당할 수도 있어서 사전에 조사를 좀 하고 있습니다.

C++ 기반의 동적 라이브러리로 개발하게 될 것 같구요, 아직 확정된건 아니지만 OS 종속적인 기능을 쓰는 건 아니기 때문에 윈도우/리눅스 양쪽 OS를 모두 고려하여 개발하게 될 수도 있을 것 같은 상황입니다.

이런 상황에서 제가 궁금한 점은, C++기반 크로스 플랫폼 DLL을 개발하고 유지보수 하는걸 좀 쉽게 도와주는 프레임워크나 라이브러리 같은게 혹시 있는지 궁금합니다.
사실 8년 전에 한 회사에서 C++ DLL 개발을 도운 적이 있는데 그땐 그냥 윈도우 API와 착 달라붙어서 비주얼 스튜디오로 개발했었거든요.
만약 리눅스용 라이브러리 (.so)도 뽑고 싶다면 전처리문을 잘 활용해서 OS별로 로직을 분리해가며 개발을 하는게 여전히 통용되는 방법인건지 궁금하네요.

뭔가 CMake 기반으로 DLL 작성에 필요한 인터페이스를 제공하고, 운영체제 별 동적 라이브러리를 편하게 컴파일해주는 그런 프레임워크나 라이브러리가 있지 않을까 생각은 합니다만, 잘 찾아지지가 않네요.
(JUCE 같은 선택지가 있긴 한데 개발할 프로그램의 성격이 조금 다르기도 하고, 라이선스도 비싸서 단념했습니다)

사실 이런 요소들 때문에 저는 C# 기반 DLL을 만들고 OS에 붙어야 되는 부분만 네이티브 언어 기반 DLL로 개발을 한다던지, 아니면 Rust 기반으로 DLL을 만든다던지 하고 싶은데요… 전자는 디버그가 힘들어진다는 점이 문제일 것 같고, Rust는 학습 측면에서 유지보수의 문제도 있고 하니 아마도 C++로 가는게 맞을 것 같다는 생각이 들긴 합니다 ㅠ.ㅠ

어떤 조언이든 좋으니 혹시 관련하여 경험이 있거나 아이디어가 있는 분들은 말씀 남겨주시면 감사하겠습니다 :face_holding_back_tears:

이 글을 쓰고 좀 더 알아본 바로는, CMake에 기반해서 빌드 시스템을 꾸리고, 라이브러리 진입점 같은건 전처리문을 써서 OS 별로 따로 작성해주는게 그나마 제일 좋은 안인 것 같긴 하네요 ;ㅅ;

1 Like

동일한 C++ 소스코드를 윈도우에서는 DLL로 빌드하고 리눅스에서는 Makefile 만들어서 so 파일로 빌드한 다음 .NET 프로그램에서 DllImport 해서 사용할 수 있습니다.(제가 이렇게 개발하고 있습니다)
참고로 GUI는 AvaloniaUI 를 사용하고있습니다.(윈도우/리눅스 공통)

2 Likes

개발경험 공유해주셔서 감사합니다!
C++ & .NET 조합으로 크로스 플랫폼 앱 개발을 하고 계시군요.

말씀을 들어보니 가능한 한 STL 범위 안에서 놀고, 그렇지 않은 경우엔 전처리문으로 OS별 로직을 나눠주면 운영체제와 컴파일러가 달라도 크게 문제가 없을 것 같다는 생각이 드네요.

혹시 특정 OS에서만 좀 고려해야하는 부분이나 인지해야 했던 부분 같은 건 있으셨나요?

글을 수정했는데 AvaloniaUI 를 리눅스에서만 쓴건 아니고 윈도우/리눅스 공통으로 사용했습니다. 그러니까 그냥 AvaloniaUI 로 개발했다고 보시면 됩니다.
OS 별로 빌드를 다르게 해야하는 부분은 당연히 조건 컴파일문(c++ #if 신공 -_-)을 사용했고요.
c# 에서는 #if WINDOWS 문이나 RuntimeInformation.IsOSPlatform(OSPlatform.Linux) 같은 기능을 사용했습니다.
기본적으로 윈도우에서 빌드해서 테스트 다 해보고 정상동작하면 리눅스에서는 거의 다 되더군요.
dll 프로젝트를 솔루션에 포함시키면 c++ 소스코드 브레이크 포인트 잡고 디버깅하는것도 다 됩니다.
참고로 .csproj 파일에서 윈도우/리눅스 빌드환경에 따라 PostBuild 시 서로 다른 경로에 있는 dll/so 파일 복사하는것도 됩니다.

솔루션 안에 C# 프로젝트와 C++ 프로젝트가 같이 있으면 C++ 디버깅도 가능한건 몰랐네요! 꿀팁 감사합니다 +_+)

물론 손이 좀 가긴 하겠지만, 그래도 말씀하신 부분들을 보면 대체로 어쨌든 웬만한건 전처리나 리플렉션, 빌드 이벤트 등으로 다 처리가능한 범위인걸로 보이네요.

덕분에 정말 많이 참고가 되었습니다. 감사합니다 :blush:

2 Likes