DLL Made with CMake вызывает сбой программы - PullRequest
1 голос
/ 21 января 2020

Я пытаюсь использовать DLL, сгенерированную с помощью CMAKE и C ++. Я могу собрать библиотеку, включить ее и построить целевой проект, проблема в том, что когда я запускаю целевую сборку, она сразу падает. Мой код очень прост, и я не знаю, что мне не хватает. Библиотека построена с использованием CMAKE в отдельном проекте. Вот код

ПРОЕКТ DLL:

CMakeLists

cmake_minimum_required(VERSION 3.5)

project(LibProj LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_definitions("-DBUILD_LIB")
file(GLOB
    INCLUDE_FILES
    baselibraryclass.h
    )

file(GLOB
    SOURCE_FILES
    baselibraryclass.cpp
    )

add_library(yourlib SHARED ${INCLUDE_FILES} ${SOURCE_FILES} )

baselibraryclass.h

#ifndef BASELIBRARYCLASS_H
#define BASELIBRARYCLASS_H

#ifdef BUILD_LIB
    #define EXT_DLL __declspec(dllexport)
#else
    #define  EXT_DLL __declspec(dllimport)
#endif
#include <string>

class EXT_DLL BaseLibraryClass
{
public:

     BaseLibraryClass();
};

#endif // BASELIBRARYCLASS_H

базовый библиотечный класс. cpp

#include "baselibraryclass.h"

#include <iostream>

EXT_DLL BaseLibraryClass::BaseLibraryClass()
{
    std::cout << "Hi from the library Class Object " << std::endl;
}

Целевой проект

CMakeLists

cmake_minimum_required(VERSION 3.5)

project(TargetProject LANGUAGES CXX)
#Including the path of the library header
include_directories(D:/TestingDLLNativeCpp/Library/include)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(TargetProject main.cpp)
#The path of the built library is D:/TestingDLLNativeCpp/Library/Debug/yourlib.lib
target_link_libraries(TargetProject PRIVATE D:/TestingDLLNativeCpp/Library/Debug/yourlib.lib)  

Целевой проект main. cpp

#include <iostream>
#include <baselibraryclass.h>
using namespace std;

int main()
{
    BaseLibraryClass testObk;
    return 0;
}

Как я писал выше, cmake настраивается должным образом, и компилятор может собирать оба проекта, однако целевые исполняемые файлы немедленно аварийно завершаются. Что я делаю не так oO ??

Спасибо за внимание

1 Ответ

0 голосов
/ 01 февраля 2020

Вопрос о том, что dll не включена в каталог сборки, может быть решен установкой CMAKE_RUNTIME_OUTPUT_DIRECTORY. Тем не менее, рекомендуется установить выходной каталог .dll на целевой основе. Это обеспечит отсутствие нежелательных побочных эффектов в долгосрочной перспективе.

set_target_property(yourlib PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
...