# 4. Construindo extensões C e C++

Uma extensão C para CPython é uma biblioteca compartilhada (por exemplo, um arquivo `.so` no Linux, `.pyd` no Windows), que exporta uma função de inicialização.

Para ser importável, a biblioteca compartilhada deve estar disponível em `PYTHONPATH`, e deve ser nomeada após o nome do módulo, com uma extensão apropriada. Ao usar setuptools, o nome do arquivo correto é gerado automaticamente.

A função de inicialização tem a assinatura:

PyObject *PyInit_modulename(void)

Ela retorna um módulo totalmente inicializado ou uma instância de `PyModuleDef`. Veja Inicializando módulos C para detalhes.

Para módulos com nomes com somente ASCII, a função deve ser nomeada `PyInit_<nome>`, com `<nome>` substituído pelo nome do módulo. Ao usar Inicialização multifásica, nomes de módulos não ASCII são permitidos. Neste caso, o nome da função de inicialização é `PyInitU_<nome>`, com `<nome>` codificado usando a codificação punycode do Python com hífenes substituídos por sublinhados. Em Python:

    def nome_func_iniciadora(nome):
        try:
            sufixo = b'_' + nome.encode('ascii')
        except UnicodeEncodeError:
            sufixo = b'U_' + nome.encode('punycode').replace(b'-', b'_')
        return b'PyInit' + sufixo

É possível exportar vários módulos de uma única biblioteca compartilhada, definindo várias funções de inicialização. No entanto, importá-los requer o uso de links simbólicos ou um importador personalizado, porque por padrão apenas a função correspondente ao nome do arquivo é encontrada. Veja a seção “Multiple modules in one library” na PEP 489 para detalhes.

## 4.1. Construindo extensões C e C ++ com setuptools

O Python 3.12 e mais recente não vêm mais com distutils. Consulte a documentação `setuptools` em https://setuptools.readthedocs.io/en/latest/setuptools.html para saber mais sobre como construir e distribuir extensões C/C++ com setuptools.