我知道Unix有以下命令可以在一行中执行多个命令,我该如何在DOS中执行此操作?
command1 ; command2 ; command3 ...
Run Code Online (Sandbox Code Playgroud) 我无法在Visual Studio C++ 2012中编译/构建任何内容,因为我收到一条错误,指出我有一个不合适的ToolsVersion或者缺少ToolSet.
这是控制台中的错误:
项目文件包含ToolsVersion ="12.0".此工具集可能未知或缺失,在这种情况下,您可以通过安装相应版本的MSBuild来解决此问题,或者出于策略原因,可能已将构建强制转换为特定的ToolsVersion.像处理ToolsVersion ="4.0"那样处理项目.
1> C:\ Program Files(x86)\ MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.Cpp.Platform.targets(44,5):错误MSB8020:v120的构建工具(Platform Toolset ='v120 ')无法找到.要使用v120构建工具进行构建,请单击"项目"菜单或右键单击解决方案,然后选择"更新VC++项目...".使用v120构建工具安装v120进行构建.
我已经安装了Microsoft SDK.这也可能是相关的 - 我最近从2013年VSRC降级到2012年MSVC,但我做了一个干净的卸载.
Visual Studio 2017提供完整的CMake集成.要了解这个组合,我从这个基本样本开始:
# CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(foo)
add_executable(foo foo.cpp)
Run Code Online (Sandbox Code Playgroud)
和
// foo.cpp
int main() {}
Run Code Online (Sandbox Code Playgroud)
这正确地生成了构建脚本,并且编译和链接没有任何问题.那很简单.
另一方面,试图设置编译器选项,结果却是微不足道的.在我的情况下,我试图将警告级别设置为4.
明显的解决方案
add_compile_options("/W4")
Run Code Online (Sandbox Code Playgroud)
没有像预期的那样平息.传递给编译器的命令行现在既包含/W4(按预期),也包含/W3(从其他地方获取),产生以下警告:
Run Code Online (Sandbox Code Playgroud)cl : Command line warning D9025: overriding '/W3' with '/W4'
要解决这个问题,我需要替换任何不兼容的编译器选项,而不是只添加一个.CMake没有为此提供任何直接支持,标准解决方案(正如此问答所示)似乎是:
if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
endif()
Run Code Online (Sandbox Code Playgroud)
然而,这有两个问题:
CMAKE_CXX_FLAGS,适用于所有C++目标.这可能不是有意的(现在对我来说不是问题).我的问题是双重的:
/Wall选项,这也是不兼容的/W4. 我的目标是在我的代码中检测Windows 10,它必须跨平台以及不同版本的Windows(至少7及以上版本)工作.Windows提供IsWindows10OrGreater()了解决此问题的方法,但是还有另一个问题,此功能在以前的Windows版本中不存在.
你会发现无数的博客和SO问题,以及明显的疯狂,像这样和getversion等功能返回一些不同的版本,而不是正确的版本.
例如在我的机器上 - 该方法IsWindows10OrGreater()无法编译(我将安装Win10 SDK),并IsWindowsVersionOrGreater()报告6为主要版本.
那么有一种理智的多版本方式我可以解决这个问题吗?
我有一个使用OpenGL 3.2(+ libs)和FreeType2的程序.然后用Boost和OpenSSL编写另一个程序.OpenGL方面是为了确保文本可以呈现,而boost/openssl程序是为了安全登录/游戏服务器.
两个程序都可以通过他们的自我运作.
然而,将Boost和OpenSSL添加到游戏(GL + freetype)项目导致它无法链接.
我已经链接了以下的库以及包含文件夹的文件夹.
glimg.lib glutil.lib glfw.lib opengl32.lib freetype.lib glew32.lib user32.lib libeay32.lib ssleay32.lib
链接器错误是.
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol __imp__DeregisterEventSource@4
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol __imp__ReportEventA@36
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol __imp__RegisterEventSourceA@8
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__DeleteDC@4
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__DeleteObject@4
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__GetBitmapBits@12 …Run Code Online (Sandbox Code Playgroud) c++ linker-errors visual-studio-2010 unresolved-external linker-warning
我有一个std::string.我需要将其转换std:string为Cstring.
我尝试使用.c_str()但它只用于非unicode项目,我使用unicode项目(因为非unicode项目与VS2013一起被贬低).
任何人都可以告诉我如何转换std::string为CStringunicode项目?
本周早些时候,Kenny Kerr 在CppCon 2016 1上展示了C++/WinRT.它是基于Modern的Windows Runtime的标准C++投影.
据我所知,C++/CX编译器/预处理器/代码生成器不接触标准C++代码,而C++/WinRT是标准C++库,这是我天真的解释,C++/CX和C++/WinRT都可以在同一个项目中使用.
问题:
如果重要的话,那些问题的答案让我现在可以决定如何将我的C++/CX项目推向未来.
我有两个连接到PC的键盘.一个用于键入TMemo1,另一个用于TMemo2.两者都允许同时输入.问题是我无法区分键盘键入的键盘和键盘键入的键盘.
有什么方法可以区分,某些输入来自哪个设备?
WM_NEXTDLGCTL的文档指出,此消息将与对话框一起使用:
发送到对话框过程以将键盘焦点设置为对话框中的其他控件.
如果此消息不能与非对话框控件父项一起使用,则以通用方式(如此问题中所示)对控件进行子类化将非常繁琐,因为窗口过程必须调用SetFocus或发送WM_NEXTDLGCTL消息,基于确定背景并不是一件容易的事.
由于其他特定于对话框的API可以与非对话窗口(例如IsDialogMessage)一起使用WM_NEXTDLGCTL,因此能够在此设置中使用也很自然.
问题:可以WM_NEXTDLGCTL与非对话控制父母一起使用吗?
MSDN说(扩展窗口样式):
WS_EX_NOREDIRECTIONBITMAP:窗口不会渲染到重定向表面.这适用于没有可见内容或使用表面以外的机制来提供视觉效果的窗口.
在这种情况下,"窗口呈现到重定向表面"与"除表面之外的机制"是什么意思?以下哪一项:GDI,D3D9,D3D11,D3D12算作前者vs后者?我刚刚使用Direct3D绘图时是否应该使用这种扩展窗口样式?