我试图用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。
答案 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")