visual una studio que propias librerias libreria library incluir estandar create crear creacion compile como borland c++ visual-c++ linker static-libraries

una - librerias estandar de c++



¿Cuál es el equivalente de Microsoft Visual Studio a la opción de GCC ld--whole-archive? (7)

Creo que el equivalente más cercano sería /OPT:NOREF .

Cuando se vincula una biblioteca estática con un ejecutable, los símbolos no referenciados normalmente se descartan. En mi caso, algunos objetos no utilizados de otra manera se utilizan para registrar sus respectivas clases en una fábrica y, si se descartan los objetos, este registro falla.

Bajo Unix, donde usamos gcc, puedo pasar la bandera --whole-archive al vinculador ld (ver extracto de la documentación de ld a continuación), lo que hace que no descarte ningún objeto. ¿Hay algo como esto para Visual C ++?

- todo el archivo

Para cada archivo mencionado en la línea de comando después de la
La opción `--whole-archive '', incluye cada archivo de objeto en el archivo
en el enlace, en lugar de buscar en el archivo la información requerida
archivos de objeto. Esto se usa normalmente para convertir un archivo en
una biblioteca compartida, obligando a cada objeto a ser incluido en el
biblioteca compartida resultante. Esta opción puede ser utilizada más de una vez.


En la página de propiedades del ejecutable, consulte Propiedades comunes / Referencias / Usar entradas de dependencia de la biblioteca configurada como verdadera. Eso es más o menos el equivalente en MS de --whole-archive en pocas palabras.

Edición: Sin embargo, la biblioteca en cuestión debe ser parte de la solución.


La versión de Visual C ++ en la Actualización 2 de Visual Studio 2015 incluye un nuevo indicador para link.exe llamado /WHOLEARCHIVE , que tiene una funcionalidad equivalente a la opción --whole-archive to ld . Según la documentación de la bandera :

La opción /WHOLEARCHIVE obliga al enlazador a incluir cada archivo de objeto de una biblioteca estática especificada, o si no se especifica una biblioteca, de todas las bibliotecas estáticas especificadas al comando LINK.


Puedes usar con CMake como:

add_executable(hello ${SOURCE_FILES}) target_link_libraries(hello libA libB libC) # Not need /wholearchive libC set_target_properties(hello PROPERTIES LINK_FLAGS "/WHOLEARCHIVE:libA /WHOLEARCHIVE:libB")

Nota: /WHOLEARCHIVE solo está disponible en Visual Studio 2015 Update 2+


Que yo sepa, no hay una sola opción que garantice eso de manera confiable. Hay combinaciones de opciones de optimización que (silenciosamente) desactivan esto, así que de ninguna manera ... /INCLUDE funciona, pero para eso necesita extraer y codificar el nombre del símbolo dañado. Tiene dos opciones: (1) asegurarse de que todos los registradores estén contenidos (incluidos) en la unidad de traducción que contiene main y hacer cumplir su uso. (2) Abandona este "idioma" y utiliza el registro explícito.

Precaución: esta respuesta tiene ahora casi 7 años y las declaraciones sobre la disponibilidad de opciones en la cadena de herramientas MSVC ++ están desactualizadas. Sin embargo, todavía recomiendo no confiar en el patrón de registrador y mirar las alternativas. Por favor, siéntase libre de votar en contra debido a esta recomendación, pero creo que es un poco injusto votar en contra debido a que la opción se agregó al vinculador de Microsoft mientras tanto.


Utilicé otro enfoque: en lugar de compilar todo en una .lib y luego vincular esa .lib al ejecutable, vinculo el ejecutable directamente con los archivos .obj .

En CMake, esto se puede hacer así:

add_library(common OBJECT ${common_sources}) add_executable(executable1 "main1.cc" $<TARGET_OBJECTS:common> add_executable(executable2 "main2.cc" $<TARGET_OBJECTS:common>

Cambiar cualquiera de los archivos en ${common_sources}) solo vuelve a compilar sus objetos equivalentes y vuelve a vincular los ejecutables, lo que proporciona los mismos beneficios como si vinculara cosas a través de .lib intermedio. Al mismo tiempo, todos los constructores estáticos permanecen en su lugar, lo que resuelve el problema.

Tenga en cuenta que esto solo es útil si vincula las cosas estáticamente.

Este enfoque se probó con gcc 5.2.0, MinGW-w64 5.2.0 y MSVC 15.


Yo uso /INCLUDE: para forzar la inclusión de símbolos no utilizados.