Неопределенная ссылка только для Box2D при компиляции с помощью Terminal GCC и G ++ - PullRequest
0 голосов
/ 06 октября 2019

У меня проблемы с компиляцией программы, но только из-за статической библиотеки 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, а другой - .exe, который зависит от .dll. Единственная библиотека, которой они оба должны поделиться, - это Box2D.lib. Я предполагаю, что проблема заключается в том, что они используют статическую библиотеку, и при компиляции она только один раз указывает местоположение библиотеки. Это все, что я знаю сейчас, это работает, вроде как с msbuild, но я все равно предпочел бы использовать компилятор gnu.

1 Ответ

0 голосов
/ 06 октября 2019

Похоже, пути, которые вы указываете для включаемых файлов (с -I) и для библиотек (с -L), являются относительными путями, а не абсолютными . Таким образом, вы предлагаете искать в каталоге current . Удивительно, что он прошел компиляцию и связывание, хотя добавленные вами включения, вероятно, игнорируются и обнаруживаются с помощью встроенных правил. Вы должны указать цепочку инструментов и платформу - я предполагаю, что это Windows с MinGW или подобным?

Я спрашиваю, влияют ли эти пути:

    -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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...