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

Я следую за tuto:

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 

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?

8
задан Gtker 2 May 2010 в 10:04
поделиться

3 ответа

add_executable(Cmd WIN32 cmd.c)

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

5
ответ дан 5 December 2019 в 15:21
поделиться

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

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

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

2
ответ дан 5 December 2019 в 15:21
поделиться

Согласно документации 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})
1
ответ дан 5 December 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: