在DLL构建期间包含特定文件时,LoadLibrary失败

时间:2009-04-02 12:36:58

标签: c++ loadlibrary

我在我的C ++应用程序的一个DLL中遇到了非常奇怪的行为。它工作并加载正常,直到我在DLL的主文件中使用#include包含单个文件。然后我收到此错误消息:

从D:/Targets/bin/MatrixWorkset.dll加载组件 无法加载“D:/Targets/bin/MatrixWorkset.dll”:无法加载库MatrixWorkset:对内存位置的访问无效。

现在我搜索并搜索了代码和谷歌,我无法弄清楚发生了什么。到目前为止,一切都在一个DLL中,我决定将它分成两个较小的DLL。导致问题的文件是另一个第二个库的一部分(加载正常)。

任何想法都会受到赞赏。 谢谢, 雅科

6 个答案:

答案 0 :(得分:6)

可能的原因是具有类类型的全局。构造函数从DllMain()运行,而DllMain()依次在LoadLibrary()返回之前运行。在DllMain()返回之前,您可以执行的操作有很多限制。

答案 1 :(得分:2)

标题是否可能在某处包含#pragma comment(lib,“somelibrary.lib”)语句?如果是这样,它会自动尝试导入库。

要解决这个问题,我首先查看带有depends(http://www.dependencywalker.com/)的二进制文件,看看是否存在任何你不期望的DLL依赖项。如果您确实找到了某些内容并且您在Visual Studio中,则应在链接器上启用“显示进度”AKA / VERBOSE。

由于您获得了对内存位置的无效访问,因此DLLMAIN或某些静态初始化程序可能会崩溃。你能简化MatrixWorkset.dll(假设你写的)吗?

答案 2 :(得分:0)

您描述的错误听起来像运行时错误。这个错误是由Windows自动显示还是程序发出的?

我说将调试器附加到您的应用程序并跟踪此错误的来源。 Windows无法加载依赖项吗?你的图书馆在某种程度上是否在加载时失败了?

如果你想要输入/输出你所包含的头文件,请尝试使用和不包含这个#include预编译主源文件,并将两个结果区分开来。

答案 3 :(得分:0)

我仍然没有得到它。让我回答一些问题:

1)Windows无法加载依赖项,我认为因为Dependency Walker显示一切正常。 2)我附加了一个调试器,它在尝试加载MatrixWorkset.dll时基本上打印了以下内容:

            10:04:19.234
stdout:&"warning: Loading components from D:/ScinericSoftware/VisualWorkspace/trunk/Targets/bin/MatrixWorkset.dll\n"
            10:04:19.234
stdout:&"\n"
status:Stopped: "signal-received"
status:Stopped.
            10:04:19.890
stdout:30*stopped,reason="signal-received",signal-name="SIGSEGV",signal-meaning="Segmentation fault",thread-id="1",frame={addr="0x7c919994",func="towlower",args=[],from="C:\\WINDOWS\\system32\\ntdll.dll"}
input:31info shared
input:32-stack-list-arguments 2 0 0
input:33-stack-list-locals 2
input:34-stack-list-frames
input:35-thread-list-ids
input:36-data-list-register-values x
            10:04:19.890

3)MSalters:我不确定你对“全球同类型”的意思。提出问题的文件已包含在一个不同的DLL中,它可以正常工作并成功加载DLL。

这是MatrixVariable.h文件的顶部:

#include "QtSF/Variable.h"   // Located in depending DLL (the DLL in which this file always lived.
#include "Matrix.h"    // File located in this DLL
#include "QList"      // These are all files from the Qt Framework
#include "QModelIndex"
#include "QItemSelection"
#include "QObject"

using namespace Zenautics;
using namespace std;

class MatrixVariable : public Variable
{
    Q_OBJECT
    Q_PROPERTY(int RowCount READ rowCount WRITE setRowCount)
    Q_PROPERTY(int ColumnCount READ columnCount WRITE setColumnCount)
    Q_PROPERTY(int UndoPoints READ undoPoints WRITE setUndoPoints)

public:
    //! Default constructor.
    MatrixVariable(const QString& name, int rows, int cols, double fill_real = 0, double fill_complex = 0, bool isReal = true);

等。等等。

一个可能的解决方案是将MatrixVariable文件放回到原始DLL中,但是这会破坏将DLL拆分成较小部分的整个想法,这不是一个真正的选择。

答案 4 :(得分:0)

当我最近无法从命令行EXE加载DLL时,我从GetLastError()中得到了该错误。它曾经工作,然后我添加了一些MFC代码到DLL。现在所有赌注都已关闭。

答案 5 :(得分:0)

我刚才遇到了同样的问题。一个工作得很好的dll突然停止工作了。我在初始化静态对象的CRT中接受了访问冲突。进行重建并没有解决问题。但是当我手动注释掉所有静态时,链接器抱怨文件损坏了。再次链接:工作。现在我可以LoadLibrary了。然后,我一个接一个地重新添加静态。每次,我都重新编译并测试了一个LoadLibrary。每次它工作正常。最终,我的所有静力学都回来了,事情正常。

如果我不得不猜测,链接器使用的某个中间文件已损坏(我看到链接文件不断被损坏)。如果可以的话,可能会删除所有文件并进行干净的构建?但是我猜你已经把事情弄清楚了,因为这已经是6个月了......