`@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
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
denirWinMain
yerine 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> _
derleme artırmak için başvurusu Geçers...
Geçersiz kılınmış bir Sistem için en i...
::push_back vector) kullanır değeri, s...
Linux pthread_create için başvurusu ge...
g typeinfo için başvurusu geçersiz...