我有一个包含 2 个项目的解决方案资源管理器。对于一个项目,我已经启用了/clr用/mdd。对于父项目,我有/mtd并且没有 clr 支持。当我编译这个时,我得到两个链接器错误,包括以下一个:
链接警告链接 4098:默认库可能与其他库使用 /NODEFAULTLIBS 库冲突
所以我的问题是如何/NODEFAULTLIBS在编译中使用。
提前致谢。
我正在尝试编写一个用Borland C++和Visual C++编写的程序.为此,我在VS下编译源时添加#ifdef _MSC_VER包含stdafx.h文件.代码在Borland C++中编译并执行OK,但在VS中,它失败了:
错误C1020:意外#endif
#ifdef _MSC_VER //I'm in VS
#include "stdafx.h"
#endif //this line doesn't compile in VS
#ifdef __BORLANDC__ //I'm in Borland
#pragma hdrstop
#pragma argsused
#endif
#include <iostream>
int main(int argc, char* argv[])
{
std::cout << "Hello" << std::endl;
std::cin.get();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个错误?
c++ compiler-errors c++builder conditional-compilation visual-studio
我正在寻找一个预定义的符号来编写这样的代码:
{$IFDEF LAZARUS}
// code compiles by fpc/lazarus
{$ELSE}
// code compiles by delphi
{$ENDIF}
Run Code Online (Sandbox Code Playgroud) 我正在尝试在设置两个定义中的一个或两个时禁用自动崩溃日志报告:DEBUG对于我们的调试版本和INTERNATIONAL国际版本.#ifndef但是,当我尝试在这种情况下执行此操作时,我会收到警告Extra tokens at end of #ifndef directive并使用已DEBUG定义的运行触发Crittercism.
#ifndef defined(INTERNATIONAL) || defined(DEBUG)
// WE NEED TO REGISTER WITH THE CRITTERCISM APP ID ON THE CRITTERCISM WEB PORTAL
[Crittercism enableWithAppID:@"hahayoudidntthinkidleavetherealonedidyou"];
#else
DDLogInfo(@"Crash log reporting is unavailable in the international build");
// Since Crittercism is disabled for international builds, go ahead and
// registers our custom exception handler. It's not as good sadly
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
DDLogInfo(@"Registered exception handler");
#endif
Run Code Online (Sandbox Code Playgroud)
这个真值表显示了我的期望:
INTL defined | DEBUG …Run Code Online (Sandbox Code Playgroud) 我有一些标有的辅助方法[Conditional("XXX")].目的是在仅存在XXX条件编译符号时使方法有条件地编译.我们使用它来调试和跟踪功能,它运行良好.
在我研究条件编译如何工作的过程中,我发现有几个来源说明用Conditional属性标记的方法将放在IL中,但是不会执行对方法的调用.
代码如何编译成IL而不执行?如何验证行为实际上是如上所述?我没有对IL做过多少工作,所以我的技能在这个方面都很弱.
我有一个Java项目库.我想实现,测试,并可能发布该项目的几个版本,意图与不同的Java版本一起使用:6,7,8.
最简单的方法就是复制粘贴项目并支持多个源树,但我想避免这种情况,因为它很乏味且容易出错.
另一种可能的方法是考虑"基础"项目和几个特定于Java版本的项目.版本略有不同,但我没有在类层次结构中反映这个技术开发问题的内容.
所以我在找
这可以帮助从单个源树支持几个Java版本特定的库版本,并且对lib用户透明.
我创建了一个.Net Core R2类库,它有一些我用于几个不同平台的常用代码.某些代码在.Net Core平台中无效,因此我希望将其包含在条件编译符号中.我首先搜索了互联网,看看我是否能找到一个内置符号(如Silverlight应用程序的SILVERLIGHT和Windows 8应用程序的WINFX_CORE),但无法找到任何信息,所以我决定创建自己的符号.这似乎也不起作用.
从我阅读的所有内容中添加和使用符号应该很简单,只需在Project Properties中为条件编译符号添加一个值即可 构建标签.我做到了,但似乎确实有效.这里有几个屏幕截图......
请注意,我NET_CORE在条件编译符号中添加了一个值,但是当我在代码中使用它时,代码不会被忽略.
1)是否有人知道.Net Core平台是否有内置符号(我使用的是R2)?
2)如果没有,我在创建自己的符号时做错了什么?
.xproj文件:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
<PropertyGroup Label="Globals">
<ProjectGuid>253184d7-9b42-4233-a871-8cfa3ee9e83e</ProjectGuid>
<RootNamespace>Linq2Db.NetCore</RootNamespace>
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<SccProjectName>SAK</SccProjectName>
<SccProvider>SAK</SccProvider>
<SccAuxPath>SAK</SccAuxPath>
<SccLocalPath>SAK</SccLocalPath>
</PropertyGroup>
<PropertyGroup>
<SchemaVersion>2.0</SchemaVersion>
</PropertyGroup>
<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
</Project>
Run Code Online (Sandbox Code Playgroud)
更新: 我能够使用提供的答案中的链接解决此问题.这是细节......
最初project.json文件看起来像这样......
{
"dependencies": {
"NETStandard.Library": "1.5.0-rc2-24027"
},
"frameworks": {
"netstandard1.5": {
"imports": …Run Code Online (Sandbox Code Playgroud) 有没有办法询问编译器是否打开ARC,然后根据该值有条件地编译?例如,我有一个协议:
@protocol ProtocolA
@required
-(void)protocolMethodOne
@optional
-(void)protocolMethodTwo;
@end
Run Code Online (Sandbox Code Playgroud)
如果我使用ARC,我想protocolMethodA在使用ARC时可选,并且在不使用ARC时需要.这是因为使用此方法的主要原因之一是取消分配对象实例.
话虽如此,这就是我想要发生的事情:
@protocol ProtocolA
#ifdef SOME_ARC_VARIABLE
@optional
#else
@required
#endif
-(void)protocolMethodOne
@optional
-(void)protocolMethodTwo;
@end
Run Code Online (Sandbox Code Playgroud) iphone objective-c conditional-compilation automatic-ref-counting
我发现写作
#ifdef ...
#elseif defined(...)
#else
#endif
Run Code Online (Sandbox Code Playgroud)
总是导致使用#ifdef或#else条件,而不是#elseif.但是替换#elif会导致它根据定义的内容按预期工作.#elseif的存在是否有什么令人费解的目的?如果没有,为什么预处理器不抱怨?
也许这就是为什么多年(几十年,真的),我一直在使用丑陋的#else/#endif块,因为至少它们是可靠的!
我有各种实现来partial class DeviceServices为 Android、iOS 等提供某些设备或操作系统特定功能的平台特定实现。我的应用程序的目标 API 级别为 33.0,最低版本为 API 级别 21.0。
某些 API 特定于某些 Android 版本及更高版本,因此我想确保仅在受支持的版本上调用它们。但是,我总是收到以下警告(以及类似的警告,具体取决于所使用的 API):
警告 CA1416:可在“Android”21.0 及更高版本上访问此调用站点。“WindowInsets.Type.SystemBars()”仅支持:“android”30.0 及更高版本。
以下隐藏和显示系统栏的代码适用于我迄今为止尝试过的所有设备和模拟器,但我担心早期的 Android 版本。尽管检查了正确的目标 API 版本,我仍然收到上面的警告:
static partial class DeviceServices
{
private static Activity _activity;
public static void SetActivity(Activity activity)
{
_activity = activity;
}
public static partial void HideSystemControls()
{
#if ANDROID30_0_OR_GREATER
if (Build.VERSION.SdkInt >= BuildVersionCodes.R) //R == API level 30.0
{
_activity?.Window?.InsetsController?.Hide(WindowInsets.Type.SystemBars());
}
#endif
}
public static partial void ShowSystemControls()
{
#if ANDROID30_0_OR_GREATER
if (Build.VERSION.SdkInt >= …Run Code Online (Sandbox Code Playgroud) c# ×3
c++ ×2
objective-c ×2
.net ×1
.net-4.5 ×1
android ×1
c++builder ×1
delphi ×1
freepascal ×1
il ×1
ios ×1
iphone ×1
java ×1
java-8 ×1
lazarus ×1
maui ×1
maven ×1
visual-c++ ×1