Почему компоновщик MSVC «Инкрементный компоновщик Microsoft (R)» (link.exe) игнорирует переданные библиотеки при правильC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему компоновщик MSVC «Инкрементный компоновщик Microsoft (R)» (link.exe) игнорирует переданные библиотеки при правиль

Сообщение Anonymous »

Хорошо, я прохожу через ад, пытаясь скомпилировать программу для Windows, которая довольно легко компилируется в Linux, и я сузил ее до одной команды, сгенерированной CMake, чей флаг компоновщика, похоже, не делает того, что должен. должно быть.
Вот какие шаги я делаю и где что-то идет не так:
Я использую компилятор MSVC через командную строку, cl .exe:

Код: Выделить всё

Microsoft (R) C/C++ Optimizing Compiler Version 19.40.33812 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]
и link.exe:

Код: Выделить всё

Microsoft (R) Incremental Linker Version 14.40.33812.0
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: LINK [options] [files] [@commandfile]


чтобы скомпилировать простую программу на C++, использующую SDL2 для отображения окна. Вот минимальный воспроизводимый код, который, как я подтвердил, компилируется и запускается:

Код: Выделить всё

#define SDL_MAIN_HANDLED
#include 
#include 

using namespace std;

int main(int argc, char **argv) {
SDL_SetMainReady();

// Initialize SDL
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
return 1;
}

// Create a window
SDL_Window *window = SDL_CreateWindow("SDL2 Window",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
640, 480, SDL_WINDOW_SHOWN);

if (window == nullptr) {
SDL_Quit();
return 1;
}

// Event loop
bool isRunning = true;
SDL_Event event;
while (isRunning) {
while (SDL_PollEvent(&event) != 0) {
if (event.type == SDL_QUIT) {
isRunning = false;
}
}
}

// Cleanup
SDL_DestroyWindow(window);
SDL_Quit();

return 0;
}
Довольно просто, ничего сложного.

Чтобы скомпилировать это, я запускаю следующее:

Код: Выделить всё

cl main.cpp -I "C:/SDL2/include" /c
При этом программа компилируется в main.obj. Флаг /c предназначен для того, чтобы он не связывал его.
Затем для связывания я запускаю link.exe и передаю путь к моей библиотеке и вот где все идет не так.

Код: Выделить всё

link.exe main.obj /LIBPATH:C:/SDL2/lib/x86/SDL2.lib

Microsoft (R) Incremental Linker Version 14.40.33812.0
Copyright (C) Microsoft Corporation.  All rights reserved.

main.obj : error LNK2019: unresolved external symbol _SDL_SetMainReady referenced in function _main
main.obj : error LNK2019: unresolved external symbol _SDL_CreateWindow referenced in function _main
main.obj : error LNK2019: unresolved external symbol _SDL_DestroyWindow referenced in function _main
main.obj : error LNK2019: unresolved external symbol _SDL_PollEvent referenced in function _main
main.obj : error LNK2019: unresolved external symbol _SDL_Init referenced in function _main
main.obj : error LNK2019: unresolved external symbol _SDL_Quit referenced in function _main
main.exe : fatal error LNK1120: 6 unresolved externals
Ни сообщений об ошибках, ничего, как будто я вообще не передал библиотеку (и да, я тоже это пробовал, но та же ошибка!)
Я попробовал запустить /VERBOSE, и после поиска в 1338 строках журналов нигде не SDL2.lib даже упоминается. И да, я запустил ОБА с предоставленным LIBPATH и без него, а затем проверил разницу между двумя созданными журналами, и они буквально одинаковы.
Странно, когда вместо этого я запускаю такой компоновщик:

Код: Выделить всё

link.exe main.obj /LIBPATH C:/SDL2/lib/x86/SDL2.lib
Это работает! Он создал main.exe и при запуске показывает пустое окно SDL, как и ожидалось. Если вы не заметили, единственная разница заключалась в том, что я удалил двоеточие : и добавил пробел.
Изображение

(PS: обязательно включите SDL2.dll< /strong> в той же папке на случай, если вы тестируете это самостоятельно)
Поэтому по какой-то причине, если передать без двоеточия и пробела, все работает как положено. Однако в СОБСТВЕННОЙ ДОКУМЕНТАЦИИ Microsoft указано следующее:
Изображение

И что еще более сбивает с толку то, что при запуске без аргументов программа link.exe говорит то же самое:

Код: Выделить всё

/LIBPATH:dir
За исключением случаев, когда я следую его собственным инструкциям, это не работает 😭.
Поэтому мой вопрос: почему он это делает? ? Это ошибка? Я использую его неправильно?[/b]
На самом деле я не тот, кто использует link.exe, это CMake на самом деле генерирует этот - технически правильный - вызов линкер. Итак, в таком случае, почему это еще не исправлено и могу ли я что-то сделать, чтобы CMake выдавал правильный результат? Тот факт, что я не нашел подобных вопросов в Интернете, позволяет мне предположить, что я делаю что-то неправильно.
Есть ли обходные пути или я могу вообще не использовать CMake с link.exe< /code>?
Извините, если я звучу немного истерично, я застрял в этом уже 3 дня и чувствую, что мое здравомыслие ускользает

Подробнее здесь: https://stackoverflow.com/questions/790 ... ore-passed
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Инкрементный генератор создает дубликаты имен файлов
    Anonymous » » в форуме C#
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Инкрементный генератор создает дубликаты имен файлов
    Anonymous » » в форуме C#
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Не удалось применить инкрементный OTA AOSP
    Anonymous » » в форуме Android
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Не удалось применить инкрементный OTA AOSP
    Anonymous » » в форуме Android
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Как распечатать аргументы, переданные функции при использовании Python Fire?
    Anonymous » » в форуме Python
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»