Что эквивалентно опции gm -mwindows в cmake? - PullRequest
8 голосов
/ 02 мая 2010

Я следую туто:

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?

UPDATE

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

#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;
}

UPDATE2

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

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

Ответы [ 4 ]

5 голосов
/ 02 мая 2010

add_executable (Cmd WIN32 cmd.c)

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

2 голосов
/ 27 апреля 2014

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

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

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

2 голосов
/ 02 мая 2010

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

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

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

1 голос
/ 02 мая 2010

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

Если для этого свойства задано значение true, исполняемый файл при связывании в Windows будет создаваться с точкой входа WinMain () вместо просто main (), что делает его исполняемым с графическим интерфейсом вместо консольного приложения. См. Документацию по переменным 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})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...