Что эквивалентно опции -mwindows gcc в cmake?

Я слежу за туто:

http://zetcode.com/tutorials/gtktutorial/firstprograms/

Это работает, но каждый раз, когда я дважды щелкаю по исполняемому файлу, появляется консоль, которая мне не нужна.

Как мне избавиться от этой консоли?

Я пробовал это:

add_executable(Cmd WIN32 cmd.c)

Но получил вот такую ​​фатальную ошибку:

MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
Cmd.exe : fatal error LNK1120: 1 unresolved externals

При использовании gcc напрямую работает:

gcc -o Cmd cmd.c -mwindows ..

Я предполагаю, что это как-то связано с функцией ввода: int main( int argc, char *argv[]), но почему gcc работает?

Как заставить его работать с cmake?

ОБНОВЛЕНИЕ

Позвольте мне вставить сюда исходный код для удобства:

#include <gtk/gtk.h>

int main( int argc, char *argv[])
{
  GtkWidget *window;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_widget_show(window);

  gtk_main();

  return 0;
}

ОБНОВЛЕНИЕ2

Почему gcc -mwindows работает, а add_executable(Cmd WIN32 cmd.c) нет?

Может, это не эквивалент -mwindows в cmake?


person Gtker    schedule 02.05.2010    source источник


Ответы (5)


add_executable (Cmd WIN32 cmd.c)

Сообщает CMake, что это программа Windows, и она ищет WinMain вместо main. Если вы хотите увидеть используемые флаги, вы можете запустить make VERBOSE = 1. Вопрос может заключаться в том, как вы определяете WinMain для приложений gtk? Я знаю, что с Qt вы связываете библиотеку, которая определяет его для вас.

person Bill Hoffman    schedule 02.05.2010
comment
Я хочу достичь своей цели cmake, не изменяя main на WinMain, как это сделал gcc -mwindows. - person Gtker; 02.05.2010
comment
cmake .. -DCMAKE_CXX_FLAGS = -mwindows для C ++ - person MUH Mobile Inc.; 17.03.2019

Вы можете установить эти флаги компоновщика, чтобы иметь точку входа main() и не использовать консоль:

SET(CMAKE_EXE_LINKER_FLAGS 
    "${CMAKE_EXE_LINKER_FLAGS} /subsystem:windows /ENTRY:mainCRTStartup")

Для получения дополнительной информации см. этот ответ для флаги компоновщика и этот ответ о том, как устанавливать флаги в cmake.

person Matt Eckert    schedule 27.04.2014
comment
Этот метод указания точки входа (ничего не могу сказать о подсистеме) у меня не сработал, но target_link_options предложенный в stackoverflow .com / a / 58079971/132042 сделал. Когда я посмотрел на флаги, переданные компоновщику, /ENTRY там не было. - person Tatiana Racheva; 21.02.2021

Если вы хотите, чтобы ваша программа запускалась в консольном режиме (т.е. функция main), вы должны указать это в свойствах вашего проекта в MSVC. Сейчас вы используете проект в оконном режиме (т.е. функцию WinMain, которой у вас нет, отсюда и ошибка).

Но если вы не хотите получить уродливое окно консоли, вы хотите использовать оконный режим (т.е. преобразовать вашу main функцию в подходящую WinMain функцию). Таким образом, ваше обычное окно - это все, что будет отображаться.

edit: Кстати, вы действительно не должны называть свою программу «cmd», это имя командного интерпретатора Windows.

person Blindy    schedule 02.05.2010
comment
Но я могу использовать gcc для создания оконной программы с main, почему не может cmake? Кстати, не могли бы вы уточнить, что такое правильная WinMain функция? Я пытался изменить main на WinMain, но все равно не работает. - person Gtker; 02.05.2010
comment
int main(int, char **) - консольная версия точки входа. int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) - оконная версия точки входа. - person Blindy; 02.05.2010
comment
Что касается вашего первого вопроса, cmake делает именно то, что вы ему говорите. Вы не должны спрашивать, почему не может cmake ?, вы должны спросить, почему я не могу сказать cmake ...?. - person Blindy; 02.05.2010

Для CMake 3.13 и новее вы можете использовать

target_link_options(target PRIVATE "/SUBSYSTEM:WINDOWS" "/ENTRY:mainCRTStartup")
person eyelash    schedule 24.09.2019

Согласно документации CMake для использования флага WIN32 с ADD_EXECUTABLE:

Если для этого свойства установлено значение true, исполняемый файл при связывании в Windows будет создан с точкой входа WinMain (), а не только с main (). Это делает его исполняемым файлом GUI, а не консольным приложением. См. Документацию по переменной CMAKE_MFC_FLAG, чтобы настроить использование MFC для исполняемых файлов WinMain.

Однако точка входа вашей программы main(), а не WinMain(). Вместо этого вам следует опустить флаг WIN32, но вам нужно связать его с libgtk. Итак, вы должны использовать TARGET_LINK_LIBRARIES:

FIND_PACKAGE(GTK2 2.6 REQUIRED gtk)
INCLUDE_DIRECTORIES(${GTK2_INCLUDE_DIRS})
LINK_DIRECTORIES(${GTK2_LIBRARIES})
ADD_EXECUTABLE(myprogramname source1 source2 ... sourceN)
TARGET_LINK_LIBRARIES(myprogramname ${GTK2_LIBRARIES})
person Michael Aaron Safyan    schedule 02.05.2010
comment
Спасибо. Я пробовал ваши 2 решения, но ни одно из них не работает. Первое по-прежнему генерирует консоль, а второе сообщает: cl : Command line warning D9002 : ignoring unknown option '-mwindows' - person Gtker; 02.05.2010
comment
@Michael Aaron Safyan, я вставил код выше, вы можете взглянуть? - person Gtker; 02.05.2010
comment
@Runner, извините, но у меня нет копии Windows для тестирования ... Я знаком с CMake, но не очень хорошо с Windows. Возможно, если бы вы могли показать мне документацию для флага -mwindows, я мог бы найти эквивалент CMake. - person Michael Aaron Safyan; 02.05.2010
comment
Я тоже не знаком с этим флагом, но кто-то дает эту ссылку: msdn.microsoft.com/en-us/library/fcc1zstk%28VS.71%29.aspx - person Gtker; 02.05.2010