Search
Duplicate

전문가를 위한 C++/ 크로스 플랫폼과 크로스 언어 애플리케이션 개발 방법

(전체가 아니라 C#과 차이가 있는 부분을 중심으로 요약 정리)

크로스 플랫폼 개발

(생략)

크로스 언어 개발

C와 C++ 섞어 쓰기

(생략)

패러다임 전환하기

(생략)

C 코드와 링크하기

(생략)

C#에서 C++ 코드 호출하기

이 책은 C++에 대해 설명하고 있지만 C++이 가장 뛰어나다고 주장할 마음은 전혀 없다. C++ 못지 않게 매력적인 언어로 C#이 있다. C#에서 제공하는 인터롭 서비스(interop service)를 활용하면 C# 애플리케이션에서 C++ 코드를 간편하게 호출할 수 있다.
예컨대 애플리케이션 중 GUI 부분은 C#으로 구현하고, 성능에 민감하거나 수학 연산이 많은 부분은 C++로 구현한다고 하자. (이게 내가 이 책을 공부한 이유다.) C#의 인터롭을 이용하려면 C++를 라이브러리로 만들어야 C#에서 호출할 수 있다. 윈도우 시스템에서는 라이브러리를 .DLL 파일로 만든다. 다음에 나온 C++ 코드는 라이브러리로 만들 FunctionInDLL() 함수를 정의한다. 이 함수는 유니코드 스트링을 한 개 받아서 정수 하나를 리턴한다. 이렇게 받은 스트링을 콘솔로 쓴 다음 호출한 측으로 42란 값을 리턴하도록 구현한다.
#include <iostream> using namespace std; extern "C" { __declspec(dllexport) int FunctionInDLL(const wchar_t* p) { wcout << L"The following string was received by C++:\n '"; wcout << p << L"'" << endl; return 42; } }
C++
여기서 명심할 점은 함수를 프로그램이 아닌 라이브러리로 구현한다는 것이다. 그래서 main() 함수를 구현할 필요가 없다. 구체적인 컴파일 방법은 개발 환경마다 다르다. 마이크로소프트 비주얼 C++를 사용한다면 프로젝트의 속성을 지정하는 메뉴로 가서 구성 타입을 ‘동적 라이브러리(.dll)’로 선택한다.
참고로 예제에서는 __decltype(dllexport)를 이용해서 이 함수를 반드시 라이브러리의 클라이언트에 제공하도록 링커를 설정했다. 마이크로소프트 비주얼 C++에서는 이렇게 처리한다. 다른 링커를 사용할 때는 그 링커에서 함수를 외부로 내보내는 기능을 제공하는 기법을 활용한다.
라이브러리 형태로 만들었다면 C#에서 인터롭 서비스를 사용해 여기에 있는 함수를 호출할 수 있다. 먼저 인터롭 네임스페이스를 추가한다.
using System.Runtime.InteropServices;
C++
그런 다음 함수 프로토타입을 정의한다. 그러면 C# 컴파일러는 이 함수의 구현을 찾게 된다. 이 과정을 수행하는 코드는 다음과 같이 작성한다. 여기서는 라이브러리를 HelloCpp.dll 이란 이름으로 컴파일 했다고 가정한다.
[DllImoprt("HelloCpp.dll", CharSet = CharSet.Unicode)] public static extern int FunctionInDLL(string s);
C++
첫 번째 문장은 C#이 이 함수를 HelloCpp.dll 이란 라이브러리에서 가져온다는 것을 알려준다. 이때 반드시 유니코드 스트링으로 지정해야 한다. 두 번째 문장은 그 함수의 실제 프로토타입을 정의한다. 여기서는 스트링 하나를 매개변수로 받아서 정수 하나를 리턴한다고 선언했다. 다음 코드는 C#에서 C++라이브러리를 사용하는 과정을 보여준다.
using System; using System.Runtime.InteropServices; namespace HelloCSharp { class Program { [DllImport("HelloCpp.dll", CharSet = CharSet.Unicode)] public static extern int FunctionInDLL(string s); static void Main(string[] args) { Console.WriteLine("Written by C#"); int result = FunctionInDLL("Some string from C#"); Console.WriteLine("C++ returned the value " + result); } } } // 실행 결과 // Written by C# // The following string was received by C++: // 'Some string from C#' // C++ returned the value 42
C++

JNI로 자바에서 C++ 코드 호출하기

(이하 생략)