【问题标题】:Undefined Reference only for Box2D when compiling with Terminal GCC & G++使用终端 GCC 和 G++ 编译时,仅适用于 Box2D 的未定义参考
【发布时间】:2020-02-03 18:36:08
【问题描述】:

我在编译程序时遇到问题,但这仅仅是因为 Box2D 静态库(适用于 Windows)。我链接的所有其他库都可以正常工作,编译器确实找到了.lib。起初我认为这可能是我在 x86 而不是 x64 上编译,但我已经尝试了这两种方法并得到了 x86 的不兼容库和 x64 的错误消息,我已经得到了:

C:\Users\Aether\AppData\Local\Temp\ccEPbRRr.o:main.cpp:(.text$_ZSt11make_uniqueI7b2WorldJ6b2Vec2EENSt9_MakeUniqIT_E15__single_objectEDpOT0_[_ZSt11make_uniqueI7b2WorldJ6b2Vec2EENSt9_MakeUniqIT_E15__single_objectEDpOT0_]+0x35): undefined reference to `b2World::b2World(b2Vec2 const&)'
C:\Users\Aether\AppData\Local\Temp\ccEPbRRr.o:main.cpp:(.text$_ZNKSt14default_deleteI7b2WorldEclEPS0_[_ZNKSt14default_deleteI7b2WorldEclEPS0_]+0x23): undefined reference to `b2World::~b2World()'
collect2.exe: error: ld returned 1 exit status

我用来编译的命令是:

g++ -std=c++14 -m64 -Iusr/inc -Iusr/includes -Iusr/src -o bin/Release/Starless.exe -Lusr/lib main.cpp -lfmodL64_vc -lopengl32 -lglew32s -lglfw3 -lSOIL -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lfreetype -lfmod64_vc -lBox2D

我也已经尝试在指定文件之前和之后将 -lBox2D 移动到,此时它实际上已经在命令中,但仍然不起作用。

编辑:

得到它的工作,但与 msbuild (这意味着它仍然没有解决),这给了我一个错误提示。我之前没有提到我正在编译两个项目,它们都有各自的属性,但一个是.dll,另一个是依赖于.dll的.exe。他们都需要共享的唯一库是 Box2D.lib。我猜问题出在那儿,它们共享一个静态库,并且在编译时只给出一次库的位置。这就是我目前所知道的,它可以工作,有点用 msbuild,但我还是更愿意使用 gnu 编译器。

【问题讨论】:

    标签: c++ gcc terminal g++ box2d


    【解决方案1】:

    看起来您为包含文件(-I)和库(-L)指定的路径是相对路径,而不是绝对。所以你告诉它在 current 目录下查找。令人惊讶的是它通过编译链接,尽管您添加的包含可能被忽略并通过内置规则找到。您应该指定工具链和平台 - 我假设这是带有 MinGW 之类的 Windows?

    我怀疑这些路径是否有效:

        -Iusr/inc -Iusr/includes -Iusr/src
    

    因为它们是相对路径,并且/usr/include(没有's')是应该内置的规范路径。其他的似乎不是规范的,但也许你在那里安装了一些源?

    无论如何,主要问题是找到库,因此您可能希望库路径为/usr/lib(假设那里安装了 Box2D):

    g++ -std=c++14 -m64 \
        -I/usr/inc -I/usr/includes -I/usr/src \
        -o bin/Release/Starless.exe \
        -L/usr/lib \
        -lfmodL64_vc -lopengl32 -lglew32s -lglfw3 -lSOIL \
        -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 \
        -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 \
        -lodbccp32 -lfreetype -lfmod64_vc -lBox2D \
        main.cpp
    

    【讨论】:

    • 不一样吗?我已经尝试过了,得到了同样的错误,请注意编译器没有说找不到 Box2D,它似乎找到了库,但仍然给出了未定义的引用。
    • 不,路径有一个前导斜杠。常见问题解答github.com/erincatto/Box2D/wiki/… 提到链接的常见问题是混合版本的标头和库。你是如何安装 Box2D 的,你确定只找到一个版本吗?如果任何签名已更改,则可以解释此错误。
    • Visual Studio 使用相同的 .lib 编译正常到使用 g++ 时才出现问题
    • 我刚刚注意到一些非常有趣的事情,Visual Studio 可以正常编译,但是在同一个 .sln 文件上使用 msbuild 命令时会出现与 g++ 相同的错误
    猜你喜欢
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    相关资源
    最近更新 更多