VS10 всегда ссылается на SUBSYSTEM:WINDOWS; CMake+SDL+GLEW

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

int main(int, char**) {}

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

ошибка LNK2019: ссылка на неразрешенный внешний символ main в функции __tmainCRTStartup

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


person marsuek    schedule 13.12.2011    source источник
comment
Не могли бы вы показать часть CMakeLists, где вы используете add_executable? У него есть опция WIN32, которую вы могли бы (вероятно) использовать.   -  person André    schedule 14.12.2011
comment
${SOURCES} содержит main.cpp, а ${HEADERS} содержит main.h. add_executable( NameOfMyExecutable ${SOURCES} ${HEADERS} )   -  person marsuek    schedule 16.12.2011


Ответы (1)


У меня была эта проблема сегодня вечером. Я использую 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.

Гаах! Любой вариант дает нам полпути!

Я просмотрел файлы .cmake, поставляемые с CMake (между прочим, я использую 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)

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

person Watts    schedule 20.08.2013