xcode build shared-libraries ld

Xcode "ld: biblioteca no encontrada[...] para la arquitectura x86_64"



build shared-libraries (1)

La directiva de enlace especifica solo el nombre de la biblioteca enlazada. Es decir, debe especificar el sufijo del indicador del enlazador para la biblioteca. Parece que la directiva toma "-l" y concatena el nombre para producir el indicador del enlazador.

Esto significa que la forma correcta de especificar su mapa de módulo es la siguiente.

module CGcrypt { header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/gcrypt.h" link "gcrypt" export * }

Esto generará la bandera del enlazador -lgcrypt que es la bandera del enlazador correcto.

Sin embargo, hay otro problema, que es que el vinculador debe ser capaz de encontrar el archivo dylib para gcrypt y, por defecto, solo se ve en ciertas rutas. Esos caminos se pueden encontrar ejecutando clang -Xlinker -v . La salida para mí se ve así:

tylercloutier$ clang -Xlinker -v @(#)PROGRAM:ld PROJECT:ld64-264.3.101 configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em (tvOS) Library search paths: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/lib ... more stuff ...

Ahora no estoy seguro, pero sospecho que las rutas normales de búsqueda son probablemente

/usr/lib /usr/local/lib

pero creo que Xcode ha alterado mis rutas de búsqueda para apuntar al MacOSX10.11.sdk/usr/lib , que, por cierto, tiene básicamente el mismo conjunto de archivos que /usr/lib (no están enlazados). De hecho, en El Capitan, debido a la Protección de Integridad del Sistema, incluso sudo no le permitirá editar /usr/lib .

Por lo tanto, el problema que tengo es que, aunque he instalado mis bibliotecas en /usr/local/lib , clang no puede vincularlas. Para solucionarlo, puedo especificar la ruta de búsqueda de forma explícita.

swift build -Xlinker -L/usr/local/lib/

Y nos vamos a las carreras. Incluso puedo generar un xcodeproj que tendrá el indicador del enlazador apropiado ya configurado en Other Linker Flags .

swift build -Xlinker -L/usr/local/lib/ --generate-xcodeproj

Si omite la directiva de enlace en el archivo de mapa del módulo, puede especificarlo como un indicador:

module CGcrypt { header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/gcrypt.h" export * }

Al igual que

swift build -Xlinker -L/usr/local/lib/ -lgcrypt

Cómo cambiar las rutas de búsqueda de bibliotecas predeterminadas, no sé. ¡Pero sería genial si alguien más pudiera arrojar luz sobre este asunto!

Quiero incluir libgpg-error y libgcrypt en mi swift-project y creé el siguiente module.modulemaps:

libgpgerror:

module libgpgerror { header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/gpg-error.h" link "''/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib''" export * }

libgcrypt:

module libgcrypt { header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/gcrypt.h" link "''/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/libgcrypt-1.6.5.dylib''" export * }

También agregué el "Compilador Swift - Ruta de búsqueda / Rutas de importación": /Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/** tanto para el proyecto como para el objetivo. Los módulos se encuentran, las rutas son correctas.

Sin embargo, si quiero compilar el proyecto, aparece el siguiente error:

ld: library not found for -l''/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib'' for architecture x86_64

Pero si lo hago

file /Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib

Obtengo la salida

/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib: Mach-O 64-bit dynamically linked shared library x86_64

Entonces parece que la biblioteca está en el lugar correcto y también tiene la arquitectura correcta.

Editar

Encontré una solución: eliminé la directiva de enlaces de los mapas de módulos y vinculé las bibliotecas de forma manual; esto parece funcionar ¿Pero por qué?

module libgpgerror { header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/gpg-error.h" export * }