Я следую за 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?
add_executable(Cmd WIN32 cmd.c)
Говорит CMake, что это программа Windows, и ищет WinMain вместо main. Если вы хотите увидеть используемые флаги, вы можете выполнить make VERBOSE=1. Вопрос может быть в том, как вы определяете WinMain для gtk-приложений? Я знаю, что в Qt вы подключаете библиотеку, которая определяет его для вас.
Если вы хотите, чтобы ваша программа запускалась в консольном режиме (т.е. функция main
), вы должны указать это в свойствах вашего проекта в MSVC. Сейчас вы используете проект в оконном режиме (т.е. функция WinMain
, которой у вас нет, отсюда и ошибка).
Но если вы не хотите получить уродливое окно консоли, вы хотите использовать оконный режим (т.е. преобразовать вашу main
функцию в соответствующую функцию WinMain
). Таким образом, ваше обычное окно - это все, что будет отображаться.
edit: Кстати, вы действительно не должны называть свою программу «cmd», это имя командного интерпретатора Windows.
Согласно документации 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})