C ++ DLL不会链接?

时间:2010-12-06 00:45:17

标签: c++ dll linker eclipse-cdt

好的,这是问题所在。为了提高我对C ++ API的了解,我试图了解有关库文件类型的更多信息。我有很好的静态库。您只需将库链接到项目中,并在编译和链接时将其内容放在二进制文件中。但是,当我开始尝试使用动态库时,我遇到了一个问题。我能够使用__declspec函数成功编译DLL文件,并创建extern块(因此可以成功导出到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特有的。这是真的?在这种情况下,在其他操作系统上使用什么是相当不错的?

2 个答案:

答案 0 :(得分:2)

当你构建一个dll时,你也会创建一个公司的.lib文件,即'implib'。您必须在exe中静态链接此文件。

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

答案 1 :(得分:0)

您需要告诉编译器在哪里搜索您的库和包含。在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中,您可以在以下项目中找到以下设置:项目属性 - &gt; C / C ++ Build - &gt;设置 - &gt; MinGW C ++ Linker - &gt;库。

此外,__declspec被MinGW认可,但我认为它的微软特定。