获取函数中引用的未解析的外部符号 _main ___tmainCRTStartup

Getting unresolved external symbol _main referenc ed in function ___tmainCRTStartup

我正在尝试使用 wxwidgets 构建一个简单的 GUI 程序,这是构建工具包的方式:

nmake -f makefile.vc UNICODE=1 SHARED=1 MONOLITHIC=0 BUILD=release CPPFLAGS=/MT
nmake -f makefile.vc UNICODE=1 SHARED=1 MONOLITHIC=0 BUILD=debug CPPFLAGS=/MTd
nmake -f makefile.vc UNICODE=1 SHARED=0 MONOLITHIC=1 BUILD=release CPPFLAGS=/MT
nmake -f makefile.vc UNICODE=1 SHARED=0 MONOLITHIC=1 BUILD=debug CPPFLAGS=/MTd

使用 cmake,我有这个覆盖规则

if (MSVC)
  set (CMAKE_CXX_FLAGS "/MT /DWIN32 /D_WINDOWS /W3 /GR /Zi /EHsc")
  set (CMAKE_CXX_FLAGS_DEBUG "/EHsc /D_DEBUG /MTd /Ob0 /Od")
  set (CMAKE_CXX_FLAGS_RELEASE "/EHsc /MT /Ox /Ob2 /Oi /Ot /Oy /GL /DNDEBUG")
endif ()

现在主要CMakeLists.txt

set (_PN "wxRegUser")
set (_PV "1.0.0.0")

set (CMAKE_USER_MAKE_RULES_OVERRIDE ${CMAKE_CURRENT_SOURCE_DIR}/data/c_flag_overrides.cmake)

cmake_minimum_required (VERSION 3.0)
project ("${_PN}" VERSION "${_PV}" LANGUAGES CXX)
option (USE_DLL "Use DLL" OFF)

list (APPEND _SOURCES frame.cxx main.cxx)

add_subdirectory (src)

add_custom_target (run COMMAND ${PROJECT_BINARY_DIR}/${PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX} DEPENDS ${PROJECT_NAME})

这是我在我的系统上查找 wxwidgets 的实现:

list (APPEND _COMP "core base media adv")

# Look for wxwidgets
if (UNIX)
    set (TOOLKIT_VERSION_NEED "3.0")
    set (wxWidgets_CONFIG_OPTIONS --version=${TOOLKIT_VERSION_NEED})
    find_package (wxWidgets COMPONENTS core base media adv)
else () # this my own workaround when having 4 different build options
    file (TO_CMAKE_PATH $ENV{WXWIN} mywxWidgets_ROOT_DIR)
    if (USE_DLL)
        set (mywxWidgets_LIB_DIR "vc_dll")
    else ()
        set (mywxWidgets_LIB_DIR "vc_lib")
    endif ()
    if (${CMAKE_BUILD_TYPE} STREQUAL "Release")
        set (wxWidgets_CONFIGURATION "mswu")
    else ()
        add_definitions ("-D__WXDEBUG__")
        set (wxWidgets_CONFIGURATION "mswud")
    endif ()
    if (EXISTS "${mywxWidgets_ROOT_DIR}/lib/${mywxWidgets_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h")
        set (wxWidgets_FOUND TRUE)
        include_directories ("${mywxWidgets_ROOT_DIR}/lib/${mywxWidgets_LIB_DIR}/${wxWidgets_CONFIGURATION}" "$ENV{WXWIN}/include")
        link_directories ("${mywxWidgets_ROOT_DIR}/lib/${mywxWidgets_LIB_DIR}")
    else ()
        set (wxWidgets_FOUND FALSE)
    endif ()
endif ()

if (wxWidgets_FOUND)
    if (UNIX)
        include (${wxWidgets_USE_FILE})
    else ()
        add_definitions ("-D__WXMSW__")
        list (APPEND wxWidgets_LIBRARIES kernel32.lib winmm.lib user32.lib gdi32.lib comdlg32.lib comctl32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib rpcrt4.lib wsock32.lib)
        if (USE_DLL)
            add_definitions ("-DWXUSINGDLL")
            if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
                add_definitions ("-D__WXDEBUG__")
                message ("-- wxWidgets Code: Debug|DLL") # checked
                list (APPEND wxWidgets_LIBRARIES "wxbase30ud.lib wxmsw30ud_core.lib")
            else ()
                message ("-- wxWidgets Code: Release|DLL")
                list (APPEND wxWidgets_LIBRARIES "wxbase30u.lib wxmsw30u_core.lib")
            endif ()
        else ()
            if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
                add_definitions ("-D__WXDEBUG__")
                message ("-- wxWidgets Code: Debug|Lib") # testing ...
                list (APPEND wxWidgets_LIBRARIES wxmsw30ud.lib wxpngd.lib wxzlibd.lib wxjpegd.lib wxtiffd.lib wxexpatd.lib wxregexud.lib)
            else ()
                message ("-- wxWidgets Code: Release|Lib")
                list (APPEND wxWidgets_LIBRARIES "wxmsw30u.lib")
            endif ()
        endif ()
    endif ()
else ()
    message (FATAL_ERROR "wxWidgets not found")
endif ()

include_directories ("${PROJECT_SOURCE_DIR}/src")

add_executable (${PROJECT_NAME} ${_SOURCES})
target_link_libraries(${PROJECT_NAME} ${wxWidgets_LIBRARIES})
set_target_properties (${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
if (MSVC)
    set_target_properties (${PROJECT_NAME} PROPERTIES LINK_FLAGS "/SUBSYSTEM:windows")
    if (NOT USE_DLL)
        set_target_properties (${PROJECT_NAME} PROPERTIES LINK_FLAGS "/NODEFAULTLIB:msvcrtd /NODEFAULTLIB:msvcprtd")
    endif ()
endif ()

我运行 cmake 是这样的:

cmake -DCMAKE_BUILD_TYPE=Debug -DUSE_DLL=OFF ..

如您所见我确实使用了"subsystem:windows",但我仍然得到未解析的系统。我不认为是 cmake 问题,更像是我在那里遗漏了一些参数....有什么想法吗?

PS: 我使用的是 msvc 2010.

set_target_properties()if (NOT USE_DLL) 分支下调用只是分配给 LINK_FLAGS 属性 一个 new 值,它不包含"subsystem:windows".

对于值附加到属性,您应该使用通用set_property命令:

set_property(TARGET ${PROJECT_NAME} APPEND_STRING
    PROPERTY LINK_FLAGS " /NODEFAULTLIB:msvcrtd /NODEFAULTLIB:msvcprtd")