VS10 всегда ссылается на SUBSYSTEM: WINDOWS;CMake + SDL + GLEW - PullRequest
4 голосов
/ 14 декабря 2011

Я просто пытаюсь настроить простой проект, который сможет компилироваться на любой платформе, поддерживаемой CMake.Я начал свой проект на Win7-системе и написал небольшой main.cpp, который включает SDL.h и GL / glew.h.Стиль основной функции прост: c ++:

int main(int, char**) {}

В моем CMakeLists.txt я вызываю find_package (SDL) и find_package (GLEW).CMake-часть работает хорошо, поэтому я просто открыл vs10-решение-файл и попытался скомпилировать, когда получаю LNK2019:

ошибка LNK2019: неразрешенный внешний символ главная ссылка в функции _ _tmainCRTStartup

Это будет означать, что я выбрал не ту подсистему, не так ли?Но если я просто переключаю подсистему с CONSOLE на WINDOWS и обратно, проблема все еще существует.CMake установил скрытую опцию для этого?Как я могу скомпилировать мою простую программу в vs10?

1 Ответ

9 голосов
/ 20 августа 2013

У меня была эта проблема сегодня вечером. Я использую CMake для создания проекта MSVC для создания моего приложения GLFW. Конечно, старый способ избавиться от окна консоли, если вы используете MSVC сам по себе, состоит в том, чтобы перейти к свойствам и установить «Подсистема» в «Windows» и «Точка входа» в mainCRTStartup, что соответствует добавлению флагов /SUBSYSTEM:WINDOWS /ENTRY:"mainCRTStartup" к link.exe, но CMake не предоставляет простого способа сделать это.

Если вы просто выполните прямую команду add_executable(), вы получите /SUBSYSTEM:CONSOLE /ENTRY:"mainCRTStartup", передаваемый компоновщику.

Если вы сделаете add_executable(exename WIN32 ...), вы получите /SUBSYSTEM:WINDOWS.

Gaah! Любой из вариантов приведет нас на полпути!

Я просмотрел файлы .cmake, которые поставляет CMake (fwiw, я использую CMake 2.8.10 и Visual Studio 2012 Express) и обнаружил, что переменная, которая, кажется, управляет флагами /SUBSYSTEM и /ENTRY называется CMAKE_CREATE_WIN32_EXE. Таким образом, чтобы установить обе части, мы просто должны изменить эту переменную. Вот то, что я закончил, что сделало трюк:

if(MSVC)
  set(CMAKE_CREATE_WIN32_EXE "/SUBSYSTEM:WINDOWS /ENTRY:\"mainCRTStartup\"")
endif(MSVC)

Надеюсь, это поможет кому-то еще.

...