programing

'WinMain@16'에 대한 정의되지 않은 참조

megabox 2023. 5. 24. 21:50
반응형

'WinMain@16'에 대한 정의되지 않은 참조

다음을 사용하여 프로그램을 빌드하려고 할 때Eclipse CDT다음을 확인할 수 있습니다.

/mingw/lib/libmingw32.a(main.o):main.c:(.text+0x106): 'WinMain@16'에 대한 정의되지 않은 참조

왜 그런 것일까요?그리고, 이 문제를 어떻게 해결할 수 있습니까?

이 오류는 링커가 찾을 수 없을 때 발생합니다.WinMain함수입니다. 따라서 누락되었을 수 있습니다.당신의 경우, 당신은 아마도 실종되었을 것입니다.main너무.

다음 윈도우즈 API 수준 프로그램을 고려해 보십시오.

#define NOMINMAX
#include <windows.h>

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

이제 특별한 옵션 없이 GNU 툴체인(예: g++)을 사용하여 빌드해 보겠습니다.여기서gnuc제가 그걸 위해 사용하는 배치 파일일 뿐입니다.G++ 표준화 옵션만 제공합니다.

C:\test> gnuc x.cpp
C:\test> objdump -x a.exe | findstr /i "^subsystem"하위 시스템 00000003(Windows CUI)
C:\test> _

즉, 링커는 기본적으로 콘솔 하위 시스템 실행 파일을 생성했습니다.파일 헤더의 하위 시스템 은 프로그램에 필요한 서비스를 Windows에 알려줍니다.이 경우 콘솔 시스템에서는 프로그램에 콘솔 창이 필요합니다.

이로 인해 명령 인터프리터는 프로그램이 완료될 때까지 기다립니다.

이제 GUI 하위 시스템으로 빌드해 보겠습니다. 이는 프로그램에 콘솔 창이 필요하지 않다는 것을 의미합니다.

C:\test> gnuc x.cpp -mwindows
C:\test> objdump -x a.exe | findstr /i "^subsystem"하위 시스템 00000002(Windows GUI)
C:\test> _

지금까지는 괜찮기를 바라지만, 비록.-mwindows플래그가 반쯤 표시되었습니다.

이 반 문서화된 플래그가 없는 빌드에서는 원하는 하위 시스템 값을 링커에 더 구체적으로 알려주어야 하며, 일반적으로 일부 윈도우즈 API 가져오기 라이브러리는 다음과 같이 명시적으로 지정해야 합니다.

C:\test> gnuc x.cpp -Wl, -subsystem, windows
C:\test> objdump -x a.exe | findstr /i "^subsystem"하위 시스템 00000002(Windows GUI)
C:\test> _

GNU 툴체인에서 잘 작동했습니다.

하지만 마이크로소프트 툴체인은 어떨까요?비주얼 C++?

콘솔 하위 시스템 실행 파일로 빌드하면 다음과 같이 문제가 없습니다.

C:\test> msvc x.cpp user32.libx.cpp
C:\test> dumpbin /headers x.exe | find /i "subsystem" | find /i "Windows"3개 하위 시스템(Windows CUI)
C:\test> _

그러나 Microsoft의 툴체인 빌드가 GUI 하위 시스템인 경우 기본적으로 작동하지 않습니다.

C:\test> msvc x.cpp user32.lib /link /subsystem:windowsx.cppLIBCMT.lib(wincrt0.obj) : 오류 LNK2019: 확인되지 않은 외부 기호 _WinMain@16이 함수 __tmainCRTStartu에서 참조됨px.exe : 치명적 오류 LNK1120: 1 확인되지 않은 외부
C:\test> _

기술적으로 이는 Microsoft의 링커가 기본적으로 GUI 하위 시스템에 대해 비표준이기 때문입니다.기본적으로 서브시스템이 GUI일 때 마이크로소프트의 링커는 머신 코드 실행이 시작되는 함수인 런타임 라이브러리 엔트리 포인트를 사용합니다.winMainCRTStartup표준 대신 마이크로소프트의 비표준을 호출합니다.main.

하지만 그것을 고치는 것은 큰 문제가 아닙니다.

Microsoft의 링커에 사용할 진입점을 알려주기만 하면 됩니다. 즉,mainCRTStartup이것이 표준이라고 부르는 것.main:

C:\test> msvc x.cpp user32.lib /link /subsystem:windows /entry:mainCRT시작x.cpp
C:\test> dumpbin /headers x.exe | find /i "subsystem" | find /i "Windows"하위 시스템 2개(Windows GUI)
C:\test> _

문제는 없지만, 매우 지루합니다.그리고 대부분 마이크로소프트의 비표준화 도구만을 사용하는 대부분의 윈도우 프로그래머들은 그것에 대해 알지도 못하고, 윈도우 GUI 하위 시스템 프로그램이 비표준화 프로그램을 "반드시" 가지고 있어야 한다고 잘못 생각할 정도로 매우 난해하고 숨겨진 것입니다.WinMain표준이 아닌mainC++0x를 사용하면 컴파일러가 독립형인지 호스트형인지를 광고해야 하기 때문에 Microsoft는 이 문제에 문제가 있을 것입니다(호스트될 때 표준을 지원해야 함).main).

어쨌든, 그것이 G++가 불평할 수 있는 이유입니다.WinMainmissing: 이는 기본적으로 GUI 하위 시스템 프로그램에 Microsoft 도구가 필요로 하는 어리석은 비표준 시작 기능입니다.

하지만 위에서 볼 수 있듯이 g++는 표준에 문제가 없습니다.mainGUI 하위 시스템 프로그램의 경우에도.

그렇다면 무엇이 문제일까요?

음, 당신은 아마도 하나를 놓치고 있을 것입니다.main그리고 당신은 아마 없을 것입니다 (적절한).WinMain둘 다!그리고 g++, 검색한 후에.main(해당 없음) 및 마이크로소프트 비표준의 경우WinMain(그렇지 않음), 후자가 누락되었음을 보고합니다.

빈 소스를 사용한 테스트:

C:\test> null >y.cpp를 입력합니다.
C:\test> nigny.cpp -mwindowsc:/프로그램 파일/mingw/bin/../lib/gcc/mingw32/4.4.1/..//../libmingw32.a(main.o):main.c:(.text+0xd2): 정의되지 않은 참조ce to 'WinMain@16'collect2: ld가 1개의 종료 상태를 반환했습니다.
C:\test> _

위의 게시물을 치어스와 hth로 요약하자면 - 알프, 꼭.main()또는WinMain()정의되고 g++는 올바른 일을 해야 합니다.

나의 문제는main()실수로 네임스페이스 내부에 정의되었습니다.

SDL로 애플리케이션을 컴파일하는 동안 이 오류가 발생했습니다.이는 SDL이 SDL_main.h에서 자체 주요 함수를 정의하기 때문에 발생했습니다.SDL을 정의하지 않으려면 SDL.h 헤더를 포함하기 전에 SDL_MAIN_HANDLED 매크로를 정의해야 합니다.

빌드하기 전에 .c 파일을 저장해 보십시오.컴퓨터가 내부에 정보가 없는 파일의 경로를 참조하고 있는 것 같습니다.

저의 상황은 주 기능이 없다는 것이었습니다.

같은 문제가 있었습니다.수정하기 위해 저장을 클릭하여 빌드하기 전에 .c 파일을 저장했습니다.컴퓨터가 내부에 정보가 없는 파일의 경로를 참조하고 있었던 것 같습니다.

프로젝트에 모든 파일이 포함되어 있는지 확인:

cLion을 업데이트한 후에도 동일한 오류가 발생했습니다.몇 시간 동안 수정한 결과, 제 파일 중 하나가 프로젝트 대상에 포함되지 않은 것을 발견했습니다.활성 프로젝트에 다시 추가한 후 winmain16에 대한 정의되지 않은 참조를 얻는 것을 중지하고 코드를 컴파일했습니다.

편집: IDE 내에서 빌드 설정을 확인할 수도 있습니다.

(이 오류가 IDE를 최근에 업데이트한 것과 관련이 있는지 확실하지 않습니다. 원인이 될 수도 있고 단순히 상관 관계가 있을 수도 있습니다.그 요소에 대해 어떤 식으로든 의견을 제시하세요!)

언급URL : https://stackoverflow.com/questions/5259714/undefined-reference-to-winmain16

반응형