SORU
10 Mart 2011, PERŞEMBE


`@16' tutamacı, sistem için başvurusu geçersiz;

Bir program Eclipse CDT kullanarak oluşturmaya çalıştığımda şu olsun:

/mingw//libmingw32 lib.bir(ana.o):ana.c:(.metin 0x106): tanımsız başvuru `@16 tutamacı, sistem

Bu yüzden mi? Ve, bu sorunu nasıl çözebilirim?

CEVAP
10 Mart 2011, PERŞEMBE


Aşağıdaki Windows düzey API program: düşünün

#define NOMINMAX
#include <windows.h>

int main()
{
    MessageBox( 0, "Blah blah...", "My Windows app!", MB_SETFOREGROUND );
}

Şimdi bakalım GNU araç zinciri (yani g ), özel seçenekleri kullanarak oluşturun. Burada gnuc sadece bunun için kullandığım bir toplu iş dosyasıdır. Sadece g daha standart yapmak için seçenekler malzemeleri:

C:\test> gnuc x.cpp

C:\test> objdump -x a.exe | findstr /i "^subsystem"
Subsystem               00000003        (Windows CUI)

C:\test> _

Bu varsayılan olarak bağlayıcı bir üretilen anlamına geliralt konsolyürütülebilir.altdosya başlığında değeri programını gerektirir ne Windows söyler. Sistem konsol bu durumda, program gerektiren bir konsol penceresi.

Bu da komut yorumlayıcı tamamlamak için program için beklemek neden olur.

Şimdi gelelim ile inşaGUİ alt sistemiprogram bir konsol penceresi gerektirmez anlamına gelir.,

C:\test> gnuc x.cpp -mwindows

C:\test> objdump -x a.exe | findstr /i "^subsystem"
Subsystem               00000002        (Windows GUI)

C:\test> _

Umarım o -mwindows bayrak sadece yarı belgelenmiş olmasına rağmen TAMAM şimdiye kadar.

Yarı belgelenmiş bayrak olmadan bir bina daha spesifik olarak değer tek istediği, linker söylemek zorundayım ki, bazı Windows kitaplıkları al o zaman genel olarak açıkça belirtilmesi gerekir API:

C:\test> gnuc x.cpp -Wl,-subsystem,windows

C:\test> objdump -x a.exe | findstr /i "^subsystem"
Subsystem               00000002        (Windows GUI)

C:\test> _

Tamam, GNU araç zinciri ile çalıştı.

Ama Microsoft, yani Visual C ? araç zinciri hakkında

Peki, konsol alt yürütülebilir bina gayet iyi çalışıyor:

C:\test> msvc x.cpp user32.lib
x.cpp

C:\test> dumpbin /headers x.exe | find /i "subsystem" | find /i "Windows"
               3 subsystem (Windows CUI)

C:\test> _

Ancak, GUI olarak Microsoft'un zinciri binası ile alt varsayılan olarak çalışmıyor:

C:\test> msvc x.cpp user32.lib /link /subsystem:windows
x.cpp
LIBCMT.lib(wincrt0.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartu
p
x.exe : fatal error LNK1120: 1 unresolved externals

C:\test> _

Teknik olarak bu, çünkü Microsoft Manifoldlar;s linker-standart olmayan GUİ alt için varsayılan olarak. Alt GUI olduğunda, varsayılan olarak, Microsoft linker çalışma zamanı kitaplığı kullanırgiriş noktasımakine kodu yürütülmesi başladığı işlev, Microsoft'un standart olmayan çağıran winMainCRTStartup denirWinMainyerine 14* *standart.

Önemli olan düzeltmek için, ama anlaşma.

Tüm yapmanız gereken, yani kullanmak için hangi Microsoft linker söylemek standart main: çağrı*, 15*,

C:\test> msvc x.cpp user32.lib /link /subsystem:windows /entry:mainCRTStartup
x.cpp

C:\test> dumpbin /headers x.exe | find /i "subsystem" | find /i "Windows"
               2 subsystem (Windows GUI)

C:\test> _

Hiç sorun değil, ama çok sıkıcı. Ve çok gizemli ve gizli en Windows programcılar, çoğunlukla yalnızca Microsoft&berti'nin standart olmayan varsayılan değer araçları bile anlarsın, ve yanlışlıkla bir Windows GUI programı alt&"&"; var olmayan standart WinMain yerine standart main. C 0 ile geçerken, Microsoft derleyici o zaman serbest olsun reklam yapma gerekir, çünkü bu bir sorun olacak, ya da standart main desteklemelidir barındırılan () ev sahipliği yaptı.

Her neyse, bu g nedeni budurolabilirWinMain hakkında eksik şikayetçi: Microsoft'un araçlar GUI alt programlar için varsayılan gerektiren standart olmayan saçma bir başlangıç fonksiyonu.

Ama yukarıda gördüğünüz gibi, g standart main hatta GUİ alt program için bir sorun vardır.

Sorun ne olabilir?

Evet, muhtemeleneksik22**. Ve muhtemelen hayır () uygun WinMain ya! Ve o zaman g main (böyle), aranır ve Microsoft'un standart olmayan WinMain (Bu) sonra ikinci kayıp olduğunu bildiriyor.

Boş bir kaynak ile test:

C:\test> type nul >y.cpp

C:\test> gnuc y.cpp -mwindows
c:/program files/mingw/bin/../lib/gcc/mingw32/4.4.1/../../../libmingw32.a(main.o):main.c:(.text 0xd2): undefined referen
ce to `WinMain@16'
collect2: ld returned 1 exit status

C:\test> _

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • failblog

    failblog

    17 HAZİRAN 2008
  • Joseph Hayhoe

    Joseph Hayho

    20 Mayıs 2010
  • Matthew Pearce

    Matthew Pear

    9 AĞUSTOS 2009