es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

cmake proyecto secundario de biblioteca compartida anidada en Visual Studio

Resumen

  • Quiero compilar un proyecto CalcMod usando una biblioteca compartida XMMathLib.
  • Ambos deben cargarse como proyectos en Visual Studio (es decir, en el Explorador de soluciones, debe haber un árbol para CalcMod y un árbol para XMMathLib). Por lo tanto, anidar XMMathLib dentro de CalcMod (y agregarlo con add_subdirectory()) parece ser la solución adecuada.
  • Además, eventualmente, queremos exportar XMMathLib como una biblioteca (compartida) dll, por lo tanto, llamamos a add_library(XMMathLib SHARED […]).
  • Sin embargo, esto desencadena un error cannot open file 'XMMathLib\Debug\XMMathLib.lib' al final de la compilación.
    De hecho, la carpeta build\XMMathLib\Debug\ contiene XMMathLib.dll, XMMathLib.ilk y XMMathLib.pdb, lo cual es consistente con mi solicitud de generar una biblioteca compartida para XMMathLib. ¿Pero entonces, por qué CalcMod busca el archivo de biblioteca estática XMMathLib.lib?!

Detalles

Así es como se organiza el proyecto:


|- build
|- src
|- CalcMod
| |- src
| |- main.cpp
|- XMMathLib
| |- src
| | |- Demo.cpp
| | |- Demo.h
| |- CMakeLists.txt
|- CMakeLists.txt

Y aquí está el contenido de cada archivo:

src/CMakeLists.txt

cmake_minimum_required(VERSION 3.22 FATAL_ERROR)
project(CalcMod CXX)
set(CMAKE_CXX_STANDARD 14)
add_subdirectory(XMMathLib)

file(GLOB_RECURSE SOURCES_CALCMOD "CalcMod/src/*.cpp")
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCES_CALCMOD})
add_executable(
    CalcMod
    ${SOURCES_CALCMOD}
)
target_link_libraries(
    CalcMod
    XMMathLib
)
target_include_directories(CalcMod PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

src/XMMathLib/CMakeLists.txt
cmake_minimum_required(VERSION 3.22 FATAL_ERROR)
project(XMMathLib CXX)
file(GLOB_RECURSE SOURCES "src/*.cpp")
add_library(XMMathLib SHARED ${SOURCES})
target_link_libraries(
XMMathLib
)

src/CalcMod/src/main.cpp
“`C++
#include <iostream>
#include "XMMathLib/src/Demo.h"

int main()
{
RunDemo();
}
“`

src/XMMathLib/src/Demo.cpp
“`C++
#include <iostream>

void RunDemo()
{
std::cout << "hello" << std::endl;
}
“`

src/XMMathLib/src/Demo.h
“`C++
#pragma once

void __declspec(dllexport) RunDemo();
“`

Parámetros de cmake:
– Visual Studio 2017
– Plataforma: Win32
– Windows SDK 10.0.19041.0

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    El error del enlazador se produce porque CalcMod espera enlazar con un archivo de biblioteca estática XMMathLib.lib, pero en este caso generamos una biblioteca compartida XMMathLib.dll. Para solucionar este error, debemos modificar el archivo CMakeLists.txt de XMMathLib para exportar una biblioteca estática en lugar de una compartida. Aquí está el código actualizado:

    cmake_minimum_required(VERSION 3.22 FATAL_ERROR)
    project(XMMathLib CXX)
    file(GLOB_RECURSE SOURCES "src/*.cpp")
    add_library(XMMathLib STATIC ${SOURCES})
    target_link_libraries(
        XMMathLib
        )
    

    Ahora, cuando construimos nuestro proyecto, build\XMMathLib\Debug\ contendrá XMMathLib.lib en lugar de XMMathLib.dll. CalcMod se enlazará con este archivo y el programa debería funcionar sin errores.

Comments are closed.