2010-05-02 18 views
8

tôi sau tuto:Tương đương với tùy chọn gcc's -mwindows trong cmake là gì?

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

Nó hoạt động nhưng mỗi lần tôi nhấp đúp chuột vào tập tin thực thi, có một giao diện điều khiển mà tôi không muốn nó ở đó.

Làm cách nào để thoát khỏi bảng điều khiển đó?

Tôi cố gắng này:

add_executable(Cmd WIN32 cmd.c) 

Nhưng có lỗi nghiêm trọng này:

MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol [email protected] referenced in function ___tmainCRTStartup 
Cmd.exe : fatal error LNK1120: 1 unresolved externals 

Trong khi sử dụng gcc làm việc trực tiếp:

gcc -o Cmd cmd.c -mwindows .. 

Tôi đoán nó có cái gì để làm với chức năng nhập: int main(int argc, char *argv[]), nhưng tại sao gcc hoạt động?

Tôi làm cách nào để nó hoạt động với cmake?

CẬP NHẬT

Hãy để tôi dán mã nguồn vào đây để tiện theo dõi:

#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

Tại sao gcc -mwindows công trình nhưng add_executable(Cmd WIN32 cmd.c) không?

Có thể đó không phải là tương đương với -mwindows trong cmake?

Trả lời

2

Nếu bạn muốn chương trình của mình chạy trong chế độ bảng điều khiển (tức là một hàm main), bạn phải chỉ định nó trong thuộc tính của dự án trong MSVC. Những gì bạn đang sử dụng ngay bây giờ là một dự án trong chế độ cửa sổ (tức là một hàm WinMain, mà bạn không có, do đó lỗi).

Nhưng nếu bạn không muốn có cửa sổ bảng điều khiển xấu, bạn muốn sử dụng chế độ cửa sổ (tức là chuyển hàm main thành hàm propper WinMain). Bằng cách này, cửa sổ bình thường của bạn là tất cả những gì sẽ hiển thị.

chỉnh sửa: Ngoài ra, bạn thực sự không nên đặt tên cho chương trình "cmd" của bạn, đó là tên của trình thông dịch lệnh của Windows.

+0

Nhưng tôi có thể sử dụng gcc để xây dựng một cửa sổ programe với 'main', tại sao không thể' cmake'? BTW, bạn có thể xây dựng chức năng 'WinMain' của propper không? Tôi đã cố gắng thay đổi 'main' thành' WinMain' nhưng vẫn không hoạt động. – Gtker

+0

'int main (int, char **)' là phiên bản giao diện điều khiển của điểm vào. 'int WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int)' là phiên bản cửa sổ của điểm vào. – Blindy

+0

Về câu hỏi đầu tiên của bạn, cmake thực hiện chính xác những gì bạn yêu cầu. Bạn không nên hỏi "tại sao không thể cắn?", Bạn nên hỏi "tại sao tôi không thể nói với cmake ...?". – Blindy

1

Theo CMake documentation for using the WIN32 flag with ADD_EXECUTABLE:

When this property is set to true the executable when linked on Windows will be created with a WinMain() entry point instead of of just main().This makes it a GUI executable instead of a console application. See the CMAKE_MFC_FLAG variable documentation to configure use of MFC for WinMain executables.

Tuy nhiên, điểm mấu chốt của chương trình của bạn là main() và không WinMain(). Những gì bạn nên làm, thay vào đó, bỏ qua cờ WIN32, nhưng bạn cần phải liên kết với libgtk. Vì vậy, bạn sẽ sử dụng 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}) 
+0

Cảm ơn. Tôi đã thử 2 giải pháp của bạn nhưng không có giải pháp nào. Đầu tiên vẫn tạo bảng điều khiển và báo cáo thứ hai: 'cl: Cảnh báo dòng lệnh D9002: bỏ qua tùy chọn không xác định '-mwindows'' – Gtker

+0

@Michael Aaron Safyan, I đã dán mã ở trên, bạn có thể xem không? – Gtker

+0

@Runner, xin lỗi, nhưng tôi không có bản sao Windows để kiểm tra ... Tôi quen thuộc với CMake, nhưng không quá nhiều với Windows. Có lẽ nếu bạn có thể hiển thị tài liệu cho cờ "-mwindows", tôi có thể tìm ra tương đương CMake. –

4

add_executable (Cmd Win32 cmd.c)

Cho CMake đây là một chương trình Windows, và có vẻ cho WinMain thay vì chính.Nếu bạn muốn xem các cờ đang được sử dụng, bạn có thể chạy làm cho VERBOSE = 1. Câu hỏi có thể là làm thế nào để bạn xác định WinMain cho các ứng dụng gtk? Tôi biết với Qt, bạn liên kết trong một thư viện định nghĩa nó cho bạn.

+0

Tôi muốn đạt được mục tiêu của mình 'cmake' mà không thay đổi' main' thành 'WinMain', như' gcc -mwindows' đã làm. – Gtker

2

Bạn có thể thiết lập các cờ mối liên kết để có một điểm main() nhập cảnh và không có giao diện điều khiển:

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

Mọi chi tiết, thấy this answer cho cờ mối liên kết, và this answer cho làm thế nào để thiết lập cờ trong cmake.

Các vấn đề liên quan