Onde defino DYLD_LIBRARY_PATH no Mac OS X e é uma boa ideia?

28

Estou tentando instalar um solver escrito em C ++ no meu Mac (OS X), para uso com o código que escrevi no XCode.

A documentação do solucionador diz isso:

Certifique-se de ter "." no seu DYLD_LIBRARY_PATH, a fim de

  • executar os executáveis ​​prontos
  • link com o libamg.dylib (e os RTSlibs gfortran)

Eu realmente não entendo o que isso significa. Onde e o que eu preciso para mudar o quê?

Eu pesquisei no Google, mas não encontrei nada que seja simples o suficiente para um novato como eu! Se houver pessoas pacientes por aí que não se importariam em me direcionar para um recurso on-line ou me fornecer os detalhes de como e onde definir variáveis ​​de ambiente, ficaria muito grato.

Formiga
fonte

Respostas:

20

É uma variável de ambiente e, como tal, geralmente é definida no Terminal por

export DYLD_LIBRARY_PATH=someValue

man dyld diz:

DYLD_LIBRARY_PATH

Esta é uma lista separada por dois pontos de diretórios que contêm bibliotecas. O vinculador dinâmico pesquisa esses diretórios antes de pesquisar as bibliotecas nos locais padrão. Ele permite testar novas versões de bibliotecas existentes.

Para cada biblioteca que um programa usa, o vinculador dinâmico procura por cada diretório DYLD_LIBRARY_PATHpor sua vez. Se ainda não conseguir encontrar a biblioteca, ela pesquisa DYLD_FALLBACK_FRAMEWORK_PATHe, DYLD_FALLBACK_LIBRARY_PATHpor sua vez.

Use a -Lopção para otool(1). para descobrir as estruturas e bibliotecas compartilhadas às quais o executável está vinculado.


Você provavelmente iria querer algo como

export DYLD_LIBRARY_PATH=.:$DYLD_LIBRARY_PATH

para anexar .(diretório atual) à lista de locais pesquisados. No meu OS X não modificado, DYLD_LIBRARY_PATHnão tem valor atual:

$ echo $DYLD_LIBRARY_PATH

$

Dependendo de como você pretende executar o seu programa, você precisará definir isso de forma diferente, por exemplo, no Xcode (não sei onde).

Daniel Beck
fonte
1
Concordo com o @TVNshack que você normalmente não deve definir DYLD_LIBRARY_PATHnem DYLD_FRAMEWORK_PATHporque pode impedir que as bibliotecas carregadas encontrem bibliotecas fornecidas pelo sistema. Para que isso funcione melhor, use as FALLBACKversões. Mais informações nesta resposta: stackoverflow.com/a/3172515/43615
SuperTempel
21

Nunca se deve definir export DYLD_LIBRARY_PATHno seu sistema.

Os caminhos da biblioteca compartilhada podem ser corrigidos usando otool -Le install_name_tool.

Por exemplo, se você compilar o Perl DBD-MySQL, não poderá usá-lo, pois o vinculador não sabe onde você instalou o MySQL.

># make
....


># otool -L blib/arch/auto/DBD/mysql/mysql.bundle

blib/arch/auto/DBD/mysql/mysql.bundle:
        libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)


#> install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib blib/arch/auto/DBD/mysql/mysql.bundle


># otool -L blib/arch/auto/DBD/mysql/mysql.bundle

blib/arch/auto/DBD/mysql/mysql.bundle:
        /usr/local/mysql/lib/libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)



#> make test
...
Result: PASS

#> make install

Isto é tão simples assim.

TVNshack
fonte
Quick FYI: install_name_tool com falha silenciosa se o novo caminho for maior que o caminho que está substituindo. Sempre verifique com 'otool -L' se o caminho foi alterado conforme o esperado.
user15685
Digamos que eu compile um plug-in (basicamente uma biblioteca dinâmica por si só) que depende de outra biblioteca dinâmica. Como devo fornecer o plug-in e suas dependências para outros usuários?
Royi 28/10/16
Se você em vez definido DYLD_FALLBACK_FRAMEWORK_PATH, ele faz o trabalho neste caso. Isso é muito mais fácil do que alterar os caminhos internos das bibliotecas, especialmente se você precisar entregar os dylibs criados com seu aplicativo e não puder prever o caminho em que eles acabam.
SuperTempel
7

No Xcode 4, você pode adicioná-lo ao projeto Scheme para evitar erros como este:

dyld: Library not loaded: @loader_path/libLeap.dylib
  Referenced from: /Users/paulsolt/Library/Developer/Xcode/DerivedData/LeapTest-eqcxmzewheyjusgrcszyvlcxlgna/Build/Products/Debug/LeapTest
  Reason: image not found
  1. No menu, clique em "Produto" -> "Editar esquema" -> guia "Argumentos" -> Adicionar "Variáveis ​​de ambiente" -> Chave: DYLD_LIBRARY_PATH Valor: / Users / MyUserAccount / path / to / lib

  2. Altere o caminho para sua conta de usuário e o caminho completo para a pasta da biblioteca.

  3. Você deve poder construir e executar.

Definindo DYLD_LIBRARY_PATH no Xcode 4

Paul Solt
fonte