在函数___tmainCRTStartup中获取未解析的外部符号_main参考

时间:2015-09-22 23:25:27

标签: cmake wxwidgets

我试图用wxwidgets构建一个简单的GUI程序,这就是构建工具包的方式:

UIViewContentModeRedraw

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

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

现在,主要是CMakeLists.txt

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 ()

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

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})

我像这样运行cmake:

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 ()

正如您所见使用"子系统:windows",但我仍然得到未解决的系统。我不认为是cmake问题,更像是我在那里错过了一些参数....任何想法?

PS:我正在使用msvc 2010。

1 个答案:

答案 0 :(得分:1)

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")
相关问题