how - run compile c++ program linux




Quais são as diferenças entre.so e.dylib no osx? (3)

.dylib é a extensão de biblioteca dinâmica no OSX, mas nunca ficou claro para mim quando não posso / não devo usar um objeto compartilhado unix tradicional .so.

Algumas das perguntas que tenho:

  • Em um nível conceitual, quais são as principais diferenças entre .so e .dylib?
  • Quando posso / devo usar um sobre o outro?
  • Dicas e truques de compilação (Por exemplo, o substituto para o gcc -shared -fPIC, já que isso não funciona no osx)

A diferença entre .dylib e .so no mac os x é como eles são compilados. Para arquivos .so, você usa -shared e, para .dylib, usa -dynamiclib. Ambos .so e .dylib são intercambiáveis ​​como arquivos de bibliotecas dinâmicas e possuem um tipo como DYLIB ou BUNDLE. Heres a leitura de arquivos diferentes mostrando isso.

libtriangle.dylib:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00       DYLIB    17       1368   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS



libtriangle.so:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00       DYLIB    17       1256   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS

triangle.so:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00      BUNDLE    16       1696   NOUNDEFS DYLDLINK TWOLEVEL

A razão pela qual os dois são equivalentes no Mac OS X é para compatibilidade com outros programas do sistema operacional UNIX que compilam para o tipo de arquivo .so.

Notas de compilação: se você compila um arquivo .so ou um arquivo .dylib, é necessário inserir o caminho correto na biblioteca dinâmica durante a etapa de vinculação. Você faz isso adicionando -install_name e o caminho do arquivo ao comando de vinculação. Se você não fizer isso, você encontrará o problema visto neste post: Loucura da Biblioteca Dinâmica do Mac (Pode Ser Somente Fortran) .


Apenas uma observação que acabei de fazer enquanto construí código ingênuo no OSX com o cmake:

cmake ... -DBUILD_SHARED_LIBS = OFF ...

cria arquivos .so

enquanto

cmake ... -DBUILD_SHARED_LIBS = ON ...

cria arquivos .dynlib.

Talvez isso ajude alguém.


O formato de arquivo de objeto Mach-O usado pelo Mac OS X para executáveis ​​e bibliotecas distingue entre bibliotecas compartilhadas e módulos carregados dinamicamente . Use otool -hv some_file para ver o tipo de arquivo de some_file .

As bibliotecas compartilhadas do Mach-O possuem o tipo de arquivo MH_DYLIB e carregam a extensão .dylib. Eles podem ser ligados com os sinalizadores de linker estáticos usuais, por exemplo, -lfoo para libfoo.dylib. Eles podem ser criados passando o sinalizador -dynamiclib para o compilador. ( -fPIC é o padrão e não precisa ser especificado.)

Módulos carregáveis ​​são chamados de "pacotes" na fala do Mach-O. Eles têm o tipo de arquivo MH_BUNDLE . Eles podem carregar qualquer extensão; a extensão .bundle é recomendada pela Apple, mas a maioria dos softwares portados usa .so por uma questão de compatibilidade. Normalmente, você usará pacotes configuráveis ​​para plug-ins que estendem um aplicativo; Em tais situações, o pacote se vinculará ao binário do aplicativo para obter acesso à API exportada do aplicativo. Eles podem ser criados passando o sinalizador -bundle para o compilador.

Ambos dylibs e bundles podem ser carregados dinamicamente usando as APIs dl (por exemplo, dlopen , dlclose ). Não é possível vincular-se a bundles como se fossem bibliotecas compartilhadas. No entanto, é possível que um pacote esteja vinculado a bibliotecas compartilhadas reais; aqueles serão carregados automaticamente quando o pacote for carregado.

Historicamente, as diferenças foram mais significativas. No Mac OS X 10.0, não havia como carregar dinamicamente as bibliotecas. Um conjunto de APIs do dyld (por exemplo, NSCreateObjectFileImageFromFile , NSLinkModule ) foi introduzido com o 10.1 para carregar e descarregar bundles, mas eles não funcionaram para dylibs. Uma biblioteca de compatibilidade dlopen que trabalhava com pacotes foi adicionada em 10.3; em 10.4, dlopen foi reescrito para ser uma parte nativa do dyld e adicionado suporte para carregar (mas não descarregar) dylibs. Finalmente, o 10.5 incluiu suporte para usar o dlclose com dylibs e preteriu as APIs do dyld.

Em sistemas ELF como o Linux, ambos usam o mesmo formato de arquivo ; qualquer parte do código compartilhado pode ser usada como uma biblioteca e para carregamento dinâmico.

Finalmente, esteja ciente de que no Mac OS X, "bundle" também pode se referir a diretórios com uma estrutura padronizada que contém código executável e os recursos usados ​​por esse código. Há alguma sobreposição conceitual (particularmente com "bundles carregáveis" como plugins, que geralmente contêm código executável na forma de um bundle Mach-O), mas eles não devem ser confundidos com pacotes Mach-O discutidos acima.

Referências adicionais:





unix