🔥 C언어 타겟 만들기

278자
4분

C 언어 타겟을 만드는 방법은 Swift 타겟과 비슷해요. 하지만 차이점이 약간 있습니다. C 언어 라이브러리는 반드시 include 디렉토리를 가지고 있어야 해요. 이 디렉토리는 외부에 공개할 헤더 파일들을 보관하는 곳이랍니다.

Swift 타겟에서 C 언어 타겟을 가져오려면, manifest 파일에 target을 추가하면 돼요. Swift 패키지 매니저는 다음 3가지 경우에 각 C 언어 라이브러리 타겟에 대한 모듈 맵을 자동으로 만들어 줄 거예요:

  1. include/Foo/Foo.h 파일이 있고, Fooinclude 디렉토리 아래 유일한 디렉토리이며, include 디렉토리에 헤더 파일이 없다면, include/Foo/Foo.h가 umbrella 헤더가 됩니다.
  2. include/Foo.h 파일이 있고, include에 다른 하위 디렉토리가 없다면, include/Foo.h가 umbrella 헤더가 됩니다.
  3. 그 외에는 include 디렉토리가 umbrella 디렉토리가 되며, 이는 그 아래 모든 헤더 파일이 모듈에 포함된다는 걸 뜻합니다.

만약 복잡한 include 구조나 모듈과 맞지 않는 헤더 파일이 있다면, 직접 만든 module.modulemapinclude 디렉토리에 넣어줍니다. 실행 파일 타겟은 오직 하나의 올바른 C 언어 main 파일만 허용합니다. 예를 들어, 같은 타겟에 main.cmain.cpp를 함께 넣을 수 없답니다. 아래는 C 언어 라이브러리 타겟을 설정하는 간단한 예시입니다.

// Package.swift
let package = Package(
    name: "MyCLibrary",
    products: [
        .library(name: "MyCLibrary", targets: ["MyCLibrary"]),
    ],
    targets: [
        .target(
            name: "MyCLibrary",
            dependencies: []
        ),
    ]
)
swift

위 코드는 MyCLibrary라는 C 언어 라이브러리 타겟을 정의하고 있어요.

// MyCLibrary 디렉토리 구조
.
├── include
│   ├── MyCLibrary
│   │   └── MyCLibrary.h
│   └── module.modulemap
└── MyCLibrary.c
text

MyCLibrary 디렉토리 구조를 보면, include 디렉토리 안에 MyCLibrary.h 헤더 파일이 있고, module.modulemap 파일도 있어요. 그리고 MyCLibrary.c 파일이 라이브러리 구현 코드를 담고 있겠죠.

이렇게 설정하면 Swift 타겟에서 MyCLibrary 모듈을 import해서 C 언어 라이브러리를 사용할 수 있어요.

import MyCLibrary
 
// C 언어 라이브러리 함수 호출
let result = myClibFunction()
swift

Swift 패키지 매니저가 대부분 작업을 자동으로 해주니까 간단한 설정만으로도 C 언어 라이브러리를 Swift 프로젝트에 통합할 수 있습니다.