【问题标题】:"The procedure entry point.... could not be located" error“程序入口点....无法定位”错误
【发布时间】:2016-01-20 19:23:40
【问题描述】:

我一直在设置我的应用程序以在 Windows 8 上编译,使用 mingw32(准确地说是 i686-w64-mingw32)。据我所知,我已经正确设置了工具链和链接等,并且应用程序在代码块内编译和运行。当我尝试在代码块之外运行发布版本时。我的应用程序依赖于 libsndfile-1、csound 和一些 SDL2 库。 Libsndfile 和 csound 是静态链接的,SDL2 是动态链接的。在我的项目文件夹中,我的 SDL2 DLL 位于 \GUI\bin 中。

当试图在代码块之外运行 .exe 时...如果我将 DLL 粘贴在一个文件夹中,该文件夹与项目文件夹中的 .exe 具有相同的相对文件路径(即 \GUI\bin),我会收到一个错误消息告诉我它找不到 SDL2 DLL

如果我将 DLL 与 .exe 放在同一个文件夹中,我会收到以下消息:

过程入口点 _ZNSt7__cxx1112basic_stringlcst11char_traitslcSt11char_traitslcESalcEE10_M_replaceEjjPKcj 在动态链接库中找不到 C:\Users\Peter\Documents\SDLGUIApp\bin\Release\SDL GUI.exe

我进行了一些研究,但我很难找到与我的情况相关的信息。当我将它们移动到与 .exe 相同的文件夹时,看到它会丢弃“找不到 DLL”错误消息,那么我猜它要么在同一个文件夹中找到它们,而这个错误是由其他原因引起的,或者,与将它们移到“正确”位置相比,将它们移动到同一个文件夹甚至更不满意。不管怎样,我被难住了!

任何帮助将不胜感激!

皮特

编辑:

我发现的一些资料表明,我链接到库的顺序可能会导致类似(尽管不相同)的错误。我试过把它们改组,但我没有试过让它变得更好。这是我的链接方式:

在其他链接器选项中:

-lmingw32 -lSDL2main -lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf

在链接库中:

C:\Program Files\Libraries\Csound6\bin\csound64.lib C:\Program 文件\库\libsndfile32\lib\libsndfile-1.lib

查看代码块的构建日志表明它首先链接“其他链接器选项”。我假设是这样,因为构建日志的最后一部分是这样说的:

-lmingw32 -lSDL2main -lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf -s -mwindows -lmingw32 "C:\Program Files\Libraries\Csound6\bin\csound64.lib" "C:\Program 文件\库\libsndfile32\lib\libsndfile-1.lib"

我不确定 -s 是什么意思,或者为什么它两次提到 -lmingw32。

编辑:

对不起,进一步的编辑...我已经了解了由于没有 main 功能,或者在代码块构建选项中选择了错误的构建类型(通常是控制台或 GUI 应用程序之间的区别)在类型选项下设置)。我已经尝试探索这些想法,但我肯定有一个“int main()”函数,main.cpp 包含在调试和发布版本中,并且我选择了“控制台应用程序”作为调试和发布的构建类型,据我所知,错误不是因为这些。

【问题讨论】:

    标签: c++ windows dll runtime-error


    【解决方案1】:
    1. 我认为问题不是“找不到 dll”。相反,我认为它是“找不到函数名”。

    2. 具体来说,如果您使用“C”进行编码,您希望链接到“myFunc()”之类的函数名称。

      如果您使用 C++ 进行编码,您会期望使用“mangled names”,例如“_ZNSt7__cxx1112basic_stringlcst11char_traitslcSt11char_traitslcESalcEE10_M_replaceEjjPKcj”。

    3. 换句话说,我认为您可能无意中编译了一些 C 函数,就好像它们是 C++ 一样,并且链接器正在寻找“损坏的名称”而不是“实际名称”。

    建议:

    一个。看看您是否将“_ZNSt7__cxx1112basic_stringlcst11char_traitslcSt11char_traitslcESalcEE10_M_replaceEjjPKcj”识别为您可能编写的函数。如果是这样,请确保它具有“.cpp”(C++)扩展名;并确保在链接命令中包含目标文件(.o 或 .obj)。

    b.否则,请确保 #include <xyz> 为您正在进行的每个外部调用提供适当的头文件 (.h)。

    c。其他一切都失败了,编写一个简单的“hello world” 5 行 SDL2 程序来验证您是否可以成功编译、链接和执行。

    d。如果“hello world”失败,请更新您的帖子:

    1. "hello world" source
    2. "hello world" compile/link command
    3. Exact error message
    

    这些链接也可能有帮助:

    【讨论】:

    • 感谢您的回复,很抱歉这么久才回复。我找不到任何类似名称的函数。尽管我想到的是它提到了字符串和字符。 Mingw 抱怨一些从 char* 到 string 或从 string 到 char* 的转换。我不在windows机器上,所以我还不能检查。我会想到点b。会影响我的程序在 IDE 内外的工作,不过我不确定,所以如果我错了,请告诉我。我会打个招呼的世界并报告回来....
    • 也感谢您的链接,虽然我还没有在其中找到问题的答案,但他们帮助我解决了一些其他问题,一旦我解决了这些问题:D 是如果答案通常有帮助,那么对答案进行投票就完成了吗?还是他们必须是问题的正确解决方案?
    猜你喜欢
    • 2014-12-21
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2013-06-28
    • 2022-12-11
    • 1970-01-01
    相关资源
    最近更新 更多