2010-01-26 14 views
9

¿Qué es la convención de nomenclatura estándar o "más popular" para compilaciones de biblioteca de MSVC?¿Cuál es la convención de nomenclatura adecuada para archivos DLL de MSVC, bibliotecas estáticas y bibliotecas de importación?

Por ejemplo, para el seguimiento de las plataformas biblioteca foo tiene estas convenciones:

Linux/gcc:

shared: libfoo.so 
import: --- 
static: libfoo.a 

Cygwin/gcc:

shared: cygfoo.dll 
import: libfoo.dll.a 
static: libfoo.a 

Windows/MinGW:

shared: libfoo.dll 
import: libfoo.dll.a 
static: libfoo.a 

¿Qué se debe usar para los buidls de MSVC? Por lo que yo sé, generalmente los nombres son foo.dll y foo.lib, pero ¿cómo se suele distinguir entre la biblioteca de importación y la estática?

Nota: Lo pregunto porque CMake crea bastante unpleasant colisión entre ellas nombrando la importación y la biblioteca estática como foo.lib. Ver bug report. La respuesta sería ayúdame a convencer a los desarrolladores para arreglar este error.

+0

SCons también "crea (esto) colisión bastante desagradable" cuando se utiliza _env.SharedLibrary_ y _env.StaticLibrary_ con el mismo nombre de destino. –

Respuesta

4

Distingue entre una biblioteca y un .dll por la extensión. Pero distingue entre una biblioteca de importación y una biblioteca estática por el nombre de archivo , no la extensión.

No existirá ningún caso en el que exista una biblioteca de importación para un conjunto de código creado para ser una biblioteca estática, o donde exista una biblioteca estática para una DLL. Estas son dos cosas diferentes.

No existe una única convención de nombre de archivo MSVC estándar. Como regla general, un nombre de biblioteca que termina en "D" suele ser una compilación de depuración del código de la biblioteca, msvcrtd.dll frente a msvcrt.dll, pero aparte de eso, no hay estándares.

5

Según lo mencionado por otros, no hay estándares, pero hay convenciones populares. No estoy seguro de cómo juzgar inequívocamente cuál es la convención más popular. Además de la nomenclatura para las bibliotecas estáticas frente a las de importación, sobre las que preguntaste, también existe una distinción análoga entre la denominación de las bibliotecas de versiones Versiones y las bibliotecas de Debug, especialmente en Windows.

Ambos casos (es decir, estático frente a importación y depuración frente a versión) pueden manejarse de una de estas dos maneras: nombres diferentes o ubicaciones de directorios diferentes. Por lo general, elijo usar nombres diferentes, porque creo que minimiza la posibilidad de confundir el tipo de biblioteca más tarde, especialmente después de la instalación u otras actividades de movimiento de archivos.

normalmente utilizo foo.dll y foo.lib para la biblioteca compartida en Windows, y foo_static.lib para la biblioteca estática, cuando desea tener ambas versiones compartidas y estáticas. He visto a otros usar esta convención, por lo que podría ser la "más popular".

por lo que recomiendo la siguiente adición a su mesa:

Windows/MSVC:

shared: foo.dll 
import: foo.lib 
static: foo_static.lib 

Luego, en cmake, que bien podría

add_library(foo_static STATIC foo.cpp) 

o

add_library(FooStatic STATIC foo.cpp) 
set_target_properties(FooStatic PROPERTIES OUTPUT_NAME "foo_static") 

si por alguna razón no desea utilizar "foo_static" como el nombre simbólico de la biblioteca.

1

Por lo que yo sé, no existe un "estándar" real, al menos ningún estándar con el que la mayoría de los programas se ajusten.

Mi convención es nombrar mi dinámico y estático .lib por igual, pero colóquelos en directorios diferentes si un proyecto admite enlaces estáticos y dinámicos.Por ejemplo:

foo-static 
    foo.lib 

foo 
    foo.lib 
    foo.dll 

La biblioteca para enlazar con depende de la elección de los directorios de la biblioteca, así que es casi totalmente desacoplado del resto del proceso de construcción (que no aparece en la fuente si utiliza MSVC de #pragma comment(lib,"foo.lib") facilidad, y no aparece en la lista de bibliotecas de importación para el enlazador).

Lo he visto bastantes veces. Además, creo que los proyectos basados ​​en MSVC/Windows tienden a pegarse más a menudo con un único tipo de vinculación oficial, ya sea estático, o dinámico. Pero esa es solo mi observación personal.

En resumen: Windows/MSVC

shared: foo.dll 
import: foo.lib 
static: foo.lib 

Usted debe ser capaz de utilizar este modelo basado en directorios con CMAKE (nunca usado). Además, no creo que sea un 'error'. Es simplemente falta de estandarización. CMAKE hace (imho) lo correcto no para establecer un pseudo-estándar si a todos les gusta de manera diferente.

2

No existe una convención de nomenclatura estándar para las bibliotecas. Los nombres de las bibliotecas tradicionales tienen el prefijo lib. Muchos vinculadores tienen opciones para anteponer lib a un nombre de biblioteca en la línea de comandos.

Las bibliotecas estáticas y dinámicas generalmente se identifican por su extensión de archivo; aunque esto no es obligatorio. Por lo tanto, libmath.a sería una biblioteca estática mientras que libmath.so o libmath.dll sería una biblioteca dinámica.

Una convención de nomenclatura común es agregar la categoría de la biblioteca al nombre. Por ejemplo, una biblioteca de matemática estática de depuración sería 'libmathd.a' o en Windows, 'lib_math_debug'. Algunas tiendas también agregan Unicode como un atributo de nombre de archivo.

Si lo desea, puede agregar _msvc al nombre de la biblioteca para indicar que la biblioteca requiere o fue creada por MSVC (para diferenciarse de GCC y otras herramientas). Una convención popular cuando se trabaja con múltiples plataformas, es colocar los objetos y las bibliotecas en carpetas específicas de la plataforma. Por ejemplo, una carpeta ./linux/ contendría objetos y bibliotecas para Linux y de manera similar ./msw/ para la plataforma Microsoft Windows.

Este es un problema de estilo. Los problemas de estilo a menudo se tratan como cuestiones religiosas: ninguno de ellos está mal, no hay un estilo universal y son una preferencia individual. Cualquiera que sea el sistema que elija, solo sea consistente.

1

Como han dicho los demás, no existe una sola estándar para asignar nombres a los archivos en Windows.

Para nuestra base de productos completa que cubre 100 de exes, dlls y libs estáticas, hemos utilizado los siguientes exitosamente desde hace muchos años y ha ahorrado mucha confusión. Es básicamente una mezcla de varios métodos que he visto utilizar a lo largo de los años.

En pocas palabras, todos nuestros archivos de prefijo y sufijo (sin incluir la extensión en sí). Todos comienzan con "om" (basado en el nombre de nuestra empresa), y luego tienen una combinación de 1 o 2 caracteres que identifica aproximadamente el área del código.

El sufijo explica qué tipo de archivo incorporado son e incluye hasta tres letras combinadas dependiendo de la compilación que incluye Unicode, Static, Debug (las compilaciones Dll son las predeterminadas y no tienen un identificador de sufijo explícito). Cuando comenzamos este sistema, Unicode no era tan frecuente y tuvimos que admitir las compilaciones Unicode y Non-Unicode (antes del sistema operativo Windows 2000), ahora todo se construye exclusivamente unicode pero aún usamos la misma nomenclatura.

Así que un .lib típico "conjunto" de archivos podría parecerse a

omfThreadud.lib (Unicode/Debug/Dll) 
omfThreadusd.lib (Unicode/Static/Debug) 
omfThreadu.lib (Unicode/Release/Dll) 
omfThreadus.lib (Unicode/static) 

Todos los archivos están incorporados en una carpeta bin común, lo que elimina una gran cantidad de problemas de DLL-infierno para los desarrolladores y también hace es más fácil ajustar la configuración del compilador/enlazador; todos apuntan a la misma ubicación usando rutas relativas y nunca hay necesidad de copiar de forma manual (o automática) las bibliotecas que un proyecto necesita. Tener estos sufijos también elimina cualquier confusión sobre qué tipo de archivo puede tener, y le garantiza que no puede tener un escenario mixto donde deposite el dll de depuración en un kit de lanzamiento o viceversa. Todos los archivos también usan un sufijo similar (Unicode/Debug) y compilan en la misma carpeta bin.

También hay una sola carpeta "incluir", cada biblioteca tiene un archivo de encabezado en la carpeta de inclusión que coincide con el nombre de la biblioteca/dll (por ejemplo omfthread.h) Ese archivo en sí # incluye todos los otros elementos que están expuestos por esa biblioteca. Esto lo hace más sencillo si desea funcionalidad que está en foo.dll simplemente #include "foo.h"; nuestras bibliotecas están muy segmentadas por áreas de funcionalidad; de hecho, no tenemos ningún dll de "cuchillo suizo", por lo que la funcionalidad completa de las bibliotecas tiene sentido. (Cada uno de estos encabezados también incluye otros encabezados de requisitos previos, ya sean nuestras bibliotecas internas u otros SDK de proveedores)

Cada uno de estos archivos de inclusión utiliza internamente macros que usan # pramga para agregar el nombre de biblioteca apropiado a la línea del enlazador para proyectos individuales no necesita preocuparse por eso. La mayoría de nuestras bibliotecas se pueden construir estáticamente o como un DLL y #define OM_LINK_STATIC (si está definido) se usa para determinar qué proyecto individual desea (usualmente usamos los DLL pero en algunos casos las bibliotecas estáticas incorporadas en el .exe hacen más sentido para el despliegue o por otras razones)

#if defined(OM_LINK_STATIC) 
#pragma comment (lib, OMLIBNAMESTATIC("OMFTHREAD")) 
#else 
#pragma comment (lib, OMLIBNAME("OMFTHREAD")) 
#endif 

Estas macros (OMLIBNAMESTATIC & OMLIBNAME) Uso _DEBUG determinar qué tipo de acumulación que es y generar el nombre de la biblioteca adecuada para añadir a la línea de enlace.

Usamos una definición común en las versiones estáticas & dll de una biblioteca para controlar la exportación adecuada de la clase/funciones en las compilaciones dll. Cada clase o función exportada desde la biblioteca está decorado con esta macro (cuyo nombre coincide con el nombre de base para la biblioteca, sin embargo, que es en gran parte poco importante)

class OMUTHREAD_DECLARE CThread : public CThreadBase 

En la versión DLL de la configuración del proyecto definimos OMFTHREAD_DECLARE = __ declspec (dllexport), en la versión de biblioteca estática de la biblioteca definimos OMFTHREAD_DECLARE como vacío.

En las bibliotecas de cabecera del archivo lo definimos en función de cómo el cliente está tratando de enlazar con él

#if defined(OM_LINK_STATIC) 
#define OMFTHREAD_DECLARE 
#else 
#define OMFTHREAD_DECLARE __declspec(dllimport) 
#endif 

Un proyecto típico que quiere usar una de nuestras bibliotecas internas que sólo tiene que añadir la adecuada incluyen a su stdafx.h (típicamente) y simplemente funciona, si necesitan vincularse con la versión estática simplemente agregan OM_LINK_STATIC a su configuración de compilación (o la definen en stdafx.h) y de nuevo solo funciona.

0

Por lo que yo sé, todavía no hay convenciones con respecto a esto. Aquí está un ejemplo de cómo lo hago:

{Proyecto} {submódulo} {Plataforma} {Arquitectura} {CompilerRuntime} _ {buildtype} lib/dll

El nombre de archivo completo, será de minúsculas solo y solo debe contener caracteres alfanuméricos con guiones bajos previamente designados. El campo de submódulo, incluido su guion bajo, es opcional.

Proyecto: contiene el nombre/identificador del proyecto. Preferiblemente tan corto como sea posible. es decir, "ADN"

Submódulo: opcional. tiene el nombre del módulo. Preferiblemente tan corto como sea posible. es decir, "dna_audio"

Plataforma: identifica la plataforma para la que se compila el binario. es decir, "win32" (Windows), "winrt", "xbox", "android".

Arquitectura: describe la arquitectura para la que se compila el binario. es decir, "x86", "x64", "brazo". Allí donde los nombres de las arquitecturas son iguales para varios bits, use su nombre seguido de bitness. es decir. "nombre16", "nombre32", "nombre64"

CompiladorEjecución: opcional. No todos los binarios se vinculan al tiempo de ejecución del compilador, pero si lo hacen, se incluye aquí. es decir, "vc90" (Visual Studio 2008), "gcc". Donde el apartamento aplicable se puede incluir, es decir, "vc90mt"

BuildType: opcional. Esto puede contener letras (en cualquier orden deseado), cada una de las cuales dice algo sobre los detalles de la construcción. d = de depuración (omitirse si liberación) t = estática (omitido si dinámica) a = ANSI (omitido si Unicode)

Ejemplos (suponiendo un proyecto llamado "ADN"): dna_win32_x86_vc90.lib/DLL dna_win32_x64_vc90_d.lib/DLL dna_win32_x86_vc90_sd.lib dna_audio_win32_x64_vc90.lib/dll dna_audio_winrt_x64_vc110.lib/dll

Cuestiones relacionadas