GNU/Linux >> Tutoriales Linux >  >> Linux

Cmake en Windows no agrega rutas de biblioteca compartidas (funciona en Linux)

Windows simplemente no tiene algunos de los conceptos necesarios para permitir que CMake configure su entorno de compilación. Al vincular, Windows buscará en el mismo directorio que el binario y luego buscará los directorios en su RUTA. No hay nada como RPATH, que se usa en la mayoría de las plataformas Unix, para inyectar en otras rutas más apropiadas. Por lo general, las DLL deben instalarse junto con sus archivos binarios, en el mismo directorio.

En mi opinión, la mejor práctica en Windows es colocar las DLL junto a los archivos binarios. CHacer intentos de hacer esto más fácil,

install(TARGETS MyTarget
  EXPORT "MyProjectTargets"
  RUNTIME DESTINATION "${INSTALL_RUNTIME_DIR}"
  LIBRARY DESTINATION "${INSTALL_LIBRARY_DIR}"
  ARCHIVE DESTINATION "${INSTALL_ARCHIVE_DIR}")

instalaría archivos DLL en el destino RUNTIME, pero colocaría las bibliotecas en el destino BIBLIOTECA. Esto significa que, por lo general, en los sistemas operativos similares a Unix, lib tiene los objetos compartidos, pero CMake sabe que las DLL son efectivamente en tiempo de ejecución y se irían a la papelera. Esperemos que esto aclare las cosas. Es imposible que CMake/Eclipse realmente mejore tanto, más allá de quizás inyectar directorios adicionales en su RUTA al hacer clic en ejecutar desde Eclipse (no estoy seguro si eso es posible).

Si le preocupa el árbol de compilación, lo siguiente funcionaría bien allí (como se sugiere en los comentarios a continuación):

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")

Si desea permitir que estos se anulen (puede ser útil), también deben protegerse con bloques if (NO var_name).


Sólo una posible respuesta a mi propia pregunta. Creo que en Linux, rpath se usa para identificar las ubicaciones de las bibliotecas dependientes, pero en Windows con mingw no puedo usar el analizador elf y, por lo tanto, no puedo usar rpath.


Linux
  1. Cómo inicializar una biblioteca compartida en Linux

  2. ¿Cómo hacer el control de versiones de una biblioteca compartida en Linux?

  3. Cómo agregar el archivo .so a java.library.path en Linux

  4. Compilación multiplataforma bajo Windows dirigida a Linux usando CMake

  5. Cómo hacer que una biblioteca compartida se retrase cargada en Linux

Cómo agregar un host remoto de Linux y Windows a Icinga 2 para monitoreo

Cómo agregar un host de Windows y Linux al servidor Nagios para monitoreo

5 mejores sistemas operativos Linux para reemplazar Windows XP

6 distribuciones de Linux para reemplazar Windows 10 y 7

Cómo ejecutar Windows 95 en Linux

Seguridad de Linux frente a Windows