【问题标题】:C++ DLL won't Link?C++ DLL不会链接?
【发布时间】:2010-12-06 00:45:17
【问题描述】:

好的,问题来了。为了提高我对 C++ API 的了解,我尝试学习更多关于库文件类型的知识。我已经很好地弄清楚了静态库。您只需将库链接到项目中,当它被编译和链接时,它的内容就会放在二进制文件中。但是,当我开始尝试使用动态库时遇到了一个问题。我能够使用 __declspec 函数成功编译 DLL 文件,并创建外部块(因此它可以成功导出到 C++)。但是,当我尝试链接文件时会出现问题。根据我在网上看到的多个教程,我创建了一个带有前向定义的标头,并将其包含到可执行项目中。然后,我确保将搜索目录以及我要导入的库的路径添加到项目构建设置中。然后,当我去构建项目时,它会产生一个链接器错误(我可以说是因为目标文件已编译)“找不到 -l [文件路径]”。是否需要进行更多配置?我认为这与我的编译器(MinGW)有关,因为 Code::Blocks(我目前正在使用 Eclipse CDT 插件)产生了类似的链接错误。

如果你需要看代码,我会在下面提供。

// EXE: main.cpp
#include <iostream>
#include "DLLTutorial.h"

int main()
{
    Function();
    std::cout << "1 + 3:\t" << Add(1, 3);
}


// DLL: DLLTutorial.cpp
#define DLL_EXPORT
#include <iostream>
#include "DLLTutorial.h"

extern "C"
{
    DLLCOMP int Add(int a, int b)
    {
        return a + b;
    };

    DLLCOMP void Function(void)
    {
        std::cout << "DLL Called!\n";
    };
};


// DLL: DLLTutorial.h
#ifndef DLLTUTORIAL_H_
#define DLLTUTORIAL_H_

#include <iostream>

#ifdef DLL_EXPORT
    #define DLLCOMP __declspec(dllexport)
#else
    #define DLLCOMP __declspec(dllimport)
#endif

extern "C"
{
    DLLCOMP int Add(int a, int b);
    DLLCOMP void Function(void);
};


#endif /* DLLTUTORIAL_H_ */

这只是我在网站上使用的非常简单的示例代码。我无法正确链接可执行文件,因此我将不胜感激任何可以给我的建议。

另外,我有一个相关的问题。在线阅读了一些教程,其中一些提到了 __declspec 函数是 Windows/Microsoft 特定的。这是真的?在这种情况下,在其他操作系统上使用什么会更好?

【问题讨论】:

    标签: c++ dll linker eclipse-cdt


    【解决方案1】:

    当您构建一个 dll 时,您还创建了一个公司的 .lib 文件,即“implib”。您必须在 exe 中静态链接此文件。

    编辑:__cdeclspec(...) 确实是微软。其他平台不知道。

    【讨论】:

    • 我假设链接器不会为您构建静态库(至少,不是没有正确的设置)?因为,我在项目的构建目录中的任何地方都找不到相应的 lib 文件。
    • 然后看看附近的dll文件(你有没有不小心把你的用户名用作密码?)
    • 链接器设置可能会阻止这种情况。我没有使用 MinGw。也可能有一个可以使用的 def 文件。
    • @Edwin:对。我用的是mingw,默认不创建任何.lib文件。
    • 既然你也在使用 MinGW,你知道我需要改变什么,以便它生成一个静态库和动态库吗?
    【解决方案2】:

    您需要告诉编译器在哪里搜索您的库和包含。在 GCC 和 MinGW 中,这是通过将 -I 用于包含和 -L 用于库来实现的。我认为您不需要生成 .lib(或 .a,因为它通常在 *nix 和 GCC 中),GCC 应该能够在 dll 中找到您的函数。

    例如,构建和链接共享库:

    g++ -shared -olibmy_dll.dll my_dll.cpp
    

    然后,假设所有文件都在同一个目录中,构建并链接 exe 并告诉 GCC 使用您的 lib:

    g++ -oapp.exe app.cpp -lmy_dll -L.
    

    注意-l-L 之间的区别,一个告诉GCC 使用什么库,另一个告诉在哪里寻找它们。在 Eclipse CDT 中,您可以在以下位置找到这些设置:项目属性 -> C/C++ 构建 -> 设置 -> MinGW C++ 链接器 -> 库。

    另外,__declspec 被 MinGW 识别,但我认为它是 Microsoft 特有的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 2015-01-21
      相关资源
      最近更新 更多