C++编译器GCC和MSVC之间的许多关键差异之一是,默认情况下,共享库中的所有符号都会被导出,而MSVC则不会导出任何符号.
一些含义是,在MSVC中,您必须导出explict实例化的模板类.
虽然我已经接受了这一点作为生活中的事实,但我想知道每种方法的设计含义,权衡,编译器设计者的角度等等是什么?
概括:
如何使用 CMake/CPack 生成 Wix 安装程序?
细节:
我试图从一个使用 Wix 的项目中生成一个安装程序,但显然,cmake/cpack 坚持使用 nsis,例如,从 repo https://github.com/ngladitz/cmake-wix-testsuite 我选择了第一个示例“基本”文件夹,其中包含 CMakeLists.txt 的以下内容
add_executable(hw hw.cpp)
install(TARGETS hw DESTINATION bin)
install(FILES hw.cpp DESTINATION src)
set(CPACK_WIX_UPGRADE_GUID "F9AAAAE2-D6AF-4EA4-BF46-B3E265400CC7")
include(CPack)
Run Code Online (Sandbox Code Playgroud)
生成 cmake 后:
cd <basic-root-folder>
mkdir MY_BUILD
cd MY_BUILD
cmake ..
Run Code Online (Sandbox Code Playgroud)
我试图运行生成的 package.vcxproj
msbuild package.vcxproj
Run Code Online (Sandbox Code Playgroud)
并得到错误
“C:\src\Samples\CPack\cmake-wix-testsuite-master\basic\MY_BUILD\PACKAGE.vcxproj”(默认目标)(1)->(PostBuildEvent 目标)-> EXEC:CPack 错误:找不到 NSIS 编译器makensis:可能它没有安装,或者不在你的路径中 [C:\src\Samples\CPack\cmake-wix-testsuite-master\ba sic\MY_BUILD\PACKAGE.vcxproj]
所以看起来它坚持使用 NSIS 生成器。
我有一个Git diff创建
git diff --full-index --ignore-submodules > mypatch.diff
Run Code Online (Sandbox Code Playgroud)
当试图将它应用于另一个git repo(同一个远程分支,更高级的修订版)时,我在标题中得到错误
git apply --3way mypatch.diff
...
error: patch failed: dir/file:189
error: repository lacks the necessary blob to fall back on 3-way merge.
error: dir/file: patch does not apply
Run Code Online (Sandbox Code Playgroud)
多个文件会发生这种情况.
https://git-scm.com/docs/git-apply状态下的文档
当补丁不能干净地应用时,如果补丁记录了应该应用的blob的身份,则回退到三向合并,并且我们在本地可以使用这些blob,可能会将冲突标记留在工作树中的文件中供用户解决.
在我的情况下,有趣的是文件(Git术语中的blob)位于目标存储库中(甚至没有重命名),因此必须通过"git apply"找到它们.
注意:过去,命令序列已经工作了好几次.
我正在使用Win32 API在C中测试以下代码,该API旨在创建一个新文件,该文件可供当前用户访问,但对其他人来说是私有的(不可访问).
为此,这拒绝所有人SID的权限,然后为当前的用户SID设置权限.
该文件已成功创建,并且权限显然已成功设置(请参阅下面的屏幕截图),但是当我尝试使用记事本打开文件时,它会显示"访问被拒绝"(我的文件浏览器在同一会话下运行),如果我打开命令提示符并执行"输入file_created.txt",则会出现相同的"访问被拒绝".
我当然可以手动恢复权限,因为我是管理员,但我们的想法是让它以编程方式工作.
代码:
#include <windows.h>
#include <AccCtrl.h>
#include <aclapi.h>
#include <stdio.h>
#include <stdexcept>
#include <string>
#undef UNICODE
int GetCurrentUserSid(PSID* pSID)
{
const int MAX_NAME = 256;
DWORD i, dwSize = 0;
HANDLE hToken;
PTOKEN_USER user;
TOKEN_INFORMATION_CLASS TokenClass = TokenUser;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_READ | TOKEN_QUERY, &hToken))
return GetLastError();
else
wprintf(L"OpenProcessToken() - got the handle to the access token!\n");
if (!GetTokenInformation(hToken, TokenClass, NULL, 0, &dwSize))
{
DWORD dwResult = GetLastError();
if (dwResult != ERROR_INSUFFICIENT_BUFFER)
{
wprintf(L"GetTokenInformation() failed, …Run Code Online (Sandbox Code Playgroud) 用于对现有构建(二进制文件集、exe、dll、lib)进行故障排除。
有没有办法使用 SDK 或其他实用程序中的命令行工具来快速检查目标文件编译时所针对的运行时库类型?
例如,给定的 .dll 显然是针对动态运行时编译的(但如果它是调试或发布版本,则仍然不明显)。
而在 .exe 的情况下则更困难(确定是否使用动态/静态和调试/发布)。
(我的意思是,无需打开 VC++ 项目文件或查看 nmake / msbuild 文件中使用的编译器选项)。
我在VB.NET中运行Windows Forms App它运行正常,我手动添加了一些代码事件,没有设计器,如下所示:
Private Sub bindingNavigatorAddNewItem_Click(sender As System.Object,e As System.EventArgs)处理BindingNavigatorAddNewItem.Click
namesBindingSource.AddNew()
结束子
而Form1.Designer.vb,InitializeComponent方法就是这个代码
AddHandler Me.BindingNavigatorAddNewItem.Click,AddressOf Me.bindingNavigatorAddNewItem_Click
现在,即使表单运行正常,事件也正确执行; 表单在设计时失败并出现错误:
值不能为空.参数名称:objectType
在System.ComponentModel.TypeDescriptor.TypeDescriptionModel.TypeDescriptor.TypeDescriptionNode.GetRuntimeType(Type objectType)at System.ComponentModel.TypeDescriptionProvider.GetRuntimeType(Type reflectionType)at Microsoft.VisualStudio.Design.MultiTargetingContextProvider.GetRuntimeType(Type objectType)at Microsoft.VisualStudio.Design.Serialization.CodeDom Microsoft.VisualStudio.Design.Serialization.CodeDom.HandlesClauseManager中的.HandlesClauseManager.GetFieldType(String fieldName,Type documentBaseType)at Microsoft.VisualStudio.Design.Serialization.CodeDom.HandlesClauseManager.GetReferencedComponentType(String componentName,CodeTypeDeclaration codeTypeDecl,ITypeResolutionService loader,IDictionary&cache)位于System.ComponentModel.Design.Serialization.TypeCodeDomSe的System.CodeDom.CodeMemberMethod.get_Statements()的Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomParser.OnMethodPopulateStatements(Object sender,EventArgs e)中的.ParseHandlesClauses(CodeTypeDeclaration codeTypeDecl,Boolean updateCache)在System.ComponentModel.Design上的Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager)的System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager manager)中的rializer.Deserialize(IDesignerSerializationManager manager,CodeTypeDeclaration declaration) .Serialization.BasicDesignerLoader.BeginLoad(IDesignerLoaderHost host)
现在,我注意到如果我通过设计器而不是手动绑定事件,就不会发生这种情况.
但是我仍然需要手动完成,因为它最终会由一些DTE自动化代码生成.
另外如果在错误之后按下"忽略并继续"链接,它会在设计时显示表格,但为什么它首先失败?
我正在尝试构建将Pub / Sub流式传输到BigQuery的以下示例:
代码是:
/*
* Copyright (C) 2018 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF …Run Code Online (Sandbox Code Playgroud) google-bigquery google-cloud-platform google-cloud-pubsub google-cloud-dataflow apache-beam
浏览示例时 http://aperiodic.net/phil/scala/s-99/p15.scala
// P15 (**) Duplicate the elements of a list a given number of times.
// Example:
// scala> duplicateN(3, List('a, 'b, 'c, 'c, 'd))
// res0: List[Symbol] = List('a, 'a, 'a, 'b, 'b, 'b, 'c, 'c, 'c, 'c, 'c, 'c, 'd, 'd, 'd)
object P15 {
def duplicateN[A](n: Int, ls: List[A]): List[A] =
ls flatMap { List.make(n, _) }
}
Run Code Online (Sandbox Code Playgroud)
线
ls flatMap { List.make(n, _) }
Run Code Online (Sandbox Code Playgroud)
产生编译器错误
"value make is not a member of object List"
Run Code Online (Sandbox Code Playgroud)
还有另一种方法可以重写这个吗?