🔥 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 언어 라이브러리 타겟을 설정하는 간단한 예시입니다.

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

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

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

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

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

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

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

YouTube 영상

채널 보기
AI는 왜 수백 차원의 벡터를 사용할까? 고차원 공간과 행렬 | 선형대수학
AI는 데이터를 어떻게 분류할까? 벡터의 거리와 KNN 알고리즘 | 선형대수학
트라이(Trie)에서 단어를 삭제하는 방법 | Trie 자료구조 이야기
투영과 예측, 그리고 선형 결합 | 선형대수학
행렬의 가장 중요한 연산 - 행렬 곱셈 | 선형대수학
트라이(Trie)를 이용한 자동 완성 알고리즘 | Trie 자료구조 이야기
인공지능은 세상을 어떻게 숫자로 읽는가? - 이미지, 소리 그리고 텍스트가 행렬이 되는 원리 | 선형대수학
마지막편, 트라이 노드를 50% 이상 줄이는 방법? 압축 트라이 성능 분석 | Trie 자료구조 이야기