簡體   English   中英

C++ DLL 從 C++.exe 引用函數和類

[英]C++ DLL referencing functions and classes from C++.exe

使用 Visual Studio 17

我編寫了一個 C++.exe 和另一個用同一個解決方案編寫的 dll 項目。 我打算使用 DLL 項目鏈接到我的 C++.exe 應用程序,DLL 能夠引用我的 C++.exe 項目中的類和函數。

我遇到了一些麻煩,因為當我構建解決方案時,DLL 項目要求鏈接到創建的 C++.obj 對象。 有什么方法可以在不使代碼復雜化的情況下使用 C++ 可執行文件中的函數?

最好的本

這不需要使您的代碼復雜化(無論如何,這超出了從 DLL 導出函數的通常情況)。

我懷疑您當前的問題主要與構建環境有關,但讓我們舉一個快速示例,說明您正在嘗試做的事情的工作(測試)代碼。

這是帶有導出函數的超級簡單可執行文件的代碼:

#include <stdio.h>
#include <conio.h>

extern "C" {
    void __declspec(dllexport) foo() {
        printf("in foo\n"); 
    }
}

int main() {
    getch();
}

請注意,這需要一個main作為其入口點,即使它不會(至少在正常情況下)不會被調用。 當然,它可以將WinMain作為其入口點——無論哪種方式,它實際上都不會被使用。 我們只需要一些東西來滿足鏈接器,這樣它就會生成可執行文件。

...這是一個聲明其導出函數的頭文件,以便其他東西(我們的 DLL)可以使用它:

#pragma once

extern "C" {
    void __declspec(dllimport) foo();
}

我們可以相當正常地構建可執行文件,除非我們必須確保它使用 DLL 中的標准庫(否則它的標准庫將不會被正確初始化,因此它將無法工作): cl /MD trash9.cpp

然后我們有DLL的代碼

#include "trash9.h"
#include <iostream>

extern "C" {
    void __declspec(dllexport) bar() {
        printf("in bar\n");
        foo();
        printf("back in bar\n");
    }
}

void DllMain() {}

...這是它的標題:

#pragma once

extern "C" {
    void __declspec(dllimport) bar();
}

DLL 還需要使用 DLL 中的標准庫,因此我們構建它如下: cl /MD /LD trash8.cpp trash9.lib /MD意味着它應該使用 DLL 中的標准庫,而/LD意味着這應該創建一個可執行文件(而不是一個可執行文件,因為它是默認的)。

最后,這是一個使用bar的可執行文件:

#include "trash8.h"

int main() { 
    bar();
}

我們可以這樣構建: cl /MD use_bar.cpp trash8.lib

當我們運行它時,我們得到了你所期望的:

in bar
in foo
back in bar

只剩下一個障礙:讓 Visual Studio 同意做你想做的事。 我的直接反應是,首先要做的是將可執行文件放在一個項目中,將 DLL 放在第二個項目中,以及(如果您正在處理)在第三個項目中使用 DLL 的可執行文件,並引用來自第二個到第一個,從第三個到第二個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM