我需要一些关于编写跨平台代码的帮助; 不是应用程序,而是库.
我正在创建一个静态和动态的库,其中大部分开发都是在Linux中完成的,我已经在Linux中生成了静态和共享库,但现在想要生成一个Windows版本的静态和动态库,其形式.lib和.dll使用相同的源代码.
这可能吗?我有点担心,因为我注意到在源代码中.dll使用_dllspec或类似的东西需要生成Windows 文件.
如果没有,那么任何人都可以建议我在Windows上编译我的代码的最佳和最快的解决方案.我不需要在Linux下进行编译我很乐意直接在Windows下进行编译.此外,我正在使用两个外部库,它们是我在Windows和Linux系统上安装的boost和Xerces XML,所以希望它们不应该成为问题.
我真正想要的是拥有一个可以在Linux和Windows下编译的单一源代码副本,以生成特定于每个平台的库.我真的不在乎是否必须编辑我的代码以支持Windows或Linux,只要我可以拥有单个源代码副本.
我有一个奇怪的问题,我似乎无法弄清楚,我有一个带有自定义NSManagedObject子类的简单实体:
@objc(EntityTest) class EntityTest: NSManagedObject {
@NSManaged var crDate: NSDate
@NSManaged var name: String
@NSManaged var completed: Bool
@NSManaged var completedOn: NSDate
}
Run Code Online (Sandbox Code Playgroud)
这是问题,我可以创建对象,并设置所有值并存储在数组中.不过,当我尝试检索同一个对象时,我可以将所有值设置为"已完成"字段.我得到一个运行时错误说"EXC_BAD_ACCESS",我可以读取值,只是无法设置它.
调试器指向:
0x32d40ae: je 0x32d4110 ; objc_msgSend + 108
0x32d40b0: movl (%eax), %edx
Run Code Online (Sandbox Code Playgroud)
也许是一些问题,因为它被视为Objective-C类并尝试发送消息来设置boolean,我知道CoreData最初将它们表示为NSNumbers有点滑稽.
有任何想法吗?我自己创建了这个类,它没有生成.
编辑:
entity.crDate = NSDate() // succeeds
entity.completed = false // fails
entity.completed.setValue(false, forKey: "completed") //succeeds
Run Code Online (Sandbox Code Playgroud)
因此,对于设置bool,使用NSManagedObject的setValue但不是直接setter,但对于非bool属性,我可以使用setter设置它.
更新:
在检查这一点时,似乎是第一次从NSEntityDescription获取后设置值,它使用正常的Swift访问器方法.稍后,当我尝试访问同一个对象(存储在数组中)时,它会尝试将其视为Objective-C样式对象,并为名为"setCompleted"的方法发送消息.我想这是有道理的,因为我使用点符号来访问它,我使用@objc指令.
我通过创建一个"setCompleted"方法来测试这个,但是在方法中我使用"completed = newValue"设置值,这使得递归调用回"setCompleted"导致它崩溃...奇怪,所以此时此刻仍然可以没有适当的解决方案.这似乎只发生在Bools.
只有解决方法是使用NSManagedObject的"setValueForKey"方法.也许将此文件作为错误报告提交?
我想知道是否有可能进行使用的服务调用,$http因此它直接返回数据而不返回承诺?我试图使用$q和推迟没有任何运气.
这就是我的意思:
我有一个服务:
angular.module('myModule').factor('myService', ['$http', '$q',
function($http, $q) {
// Public API
return {
myServiceCall: function() {
return $http.get('/server/call');
}
};
}
]);
Run Code Online (Sandbox Code Playgroud)
这就是我所说的:
// My controller:
myService.myServiceCall().then(function(data) {
$scope.data = data;
});
Run Code Online (Sandbox Code Playgroud)
我想避免这种情况,而是希望:
$scope.data = myService.myServiceCall();
Run Code Online (Sandbox Code Playgroud)
我希望它在那条线上完全解决,是否可能?
我已经尝试了$ q,defer和'then'方法的一些组合,但是由于方法立即返回,所以似乎无法正确使用它.
编辑:
如果你想知道为什么,主要的原因是我想简化控制器代码,这很容易用ngResource完成,因为这些调用会在模板中自动解决,所以我想避免需要做整个'.then'每次.
这并不是说我不喜欢Async本质,我们的大部分代码都使用它,只是在某些情况下,采用同步方式很有帮助.
我认为,就像你们中的一些人已经指出的那样,我将使用$ resource来获得足够接近的解决方案.
我目前正在依靠Node + Angular堆栈并利用Karma和Protractor进行测试.
我目前很难弄清楚如何处理创建和编辑数据的E2E测试,以及加载预期数据的需求.
搜索谷歌会出现大量各种自定义方法.我经常阅读'你应该设置你的数据'或'只是创建一个模拟'而不需要更多关于一个共同过程的细节.其他人从头开始创建一个全新的模拟模块需要花费太多开销.
我只想知道人们目前是如何做到的,并且有一个标准吗?或者人们往往只是嘲笑后端?自从你在浏览器范围内以来,模拟后端似乎并不像Karma那样简单.
我是按照预期使用MongoDB,所以很高兴在这个场景中做其他事情.特别是通过量角器自动加载夹具和数据库清理会很好.
我是使用boost的新手,我似乎无法在使用boost时如何分发应用程序的任何地方找到文档?
许多库都是共享库,我不希望我的用户安装了boost,我只使用一个库(regex)所以有一种简单的方法可以将regex库与我的应用程序打包在一起,而无需使用静态编译版?
我最近刚切换到Winston进行日志记录,并注意到在exec之后记录mongoose docs时出现问题.
例:
Model.find().exec(function (err, docs) {
console.log(docs) // Prints the collection fine
winston.info(docs) // Prints a ton on mongoose stuff, related to the query
});
Run Code Online (Sandbox Code Playgroud)
那么基本上我如何让winston日志记录以与从console.log获得的方式相同的方式进行打印?我猜它在通过调用toJSON()进行记录之前必须如何被序列化.
我是否每次都必须手动调用.toJSON()或让人们做其他事情才能自动完成这项工作?
我正在尝试有条件地加载模块,并且条件似乎有效,但是当条件为 false 时,webpack 仍然使条件模块成为捆绑包的一部分,这是导入代码:
if (process.env.FEAT_SUPPORT === 'on') {
require('feature');
console.log('Enabled')
} else {
console.log('disabled')
}
Run Code Online (Sandbox Code Playgroud)
即使该值未“打开”,它仍然需要该模块。我使用日志行对此进行了测试,并且在打开和关闭时会显示正确的日志行。
我正在使用 Webpack 定义插件来设置变量。执行上述操作的主要原因是为了保持包大小较小,但它似乎并没有这样做。
我试图在返回函数时理解mapStateToProps的机制.
所以我找不到很多文档,除了Redux文档的一个简短的摘录,通过返回一个函数提前说明,每个实例将获得自己的memoized mapStateToProps,另一个用户说这是一个优化,阻止mapStateToProps被调用父母道具变化.
所以对于列表项来说这看起来很棒,我不想为任何不影响项目的更改重新呈现大项目列表.
所以令我困惑的部分是,不会为任何父道具更改调用mapStateToProps,这是否意味着为了重新呈现单个列表'Item',它需要是一个智能连接组件才能获取改变它关心并重新渲染?或者这是否意味着它永远不会为这个特定的Item实例重新渲染?
更新:
想要澄清一下,我正在具体谈论mapStateProps的工厂功能版本.
以下是我所讨论的功能,取自React-Redux文档:
注意:在需要更多控制渲染性能的高级场景中,mapStateToProps()也可以返回一个函数.在这种情况下,该函数将用作特定组件实例的mapStateToProps().这允许您进行每个实例的memoization.您可以参考#279及其添加的测试以获取更多详细信息.大多数应用从不需要这个.
和本文中的段落:
https://medium.com/@cvetanov/redux-mapstatetoprops-optimization-5880078a8a7a
如果redux接收到一个返回函数的实现,它会执行一个闭包来包装组件自己的props,因此每次组件更改它从父组件接收的props时,都会绕过mapStateToProps的调用.它创建了一个所谓的purePropsSelector.如何做到这一点可以在这里看到.
更新2:
我正在调查提到跳过的文章,它似乎是当你在一个闭包中包装自己的道具并返回一个只使用状态的函数.因此,当父内容为每个"已连接"子项更改时,它会阻止调用mapStateToProps.
这取自我上面读到的那篇中篇文章:
function mapStateToPropsFactory(initialState, ownProps) {
// a closure for ownProps is created
// this factory is not invoked everytime the component
// changes it's props
return function mapStateToProps(state) {
return {
blogs:
state.blogs.filter(blog => blog.author === ownProps.user)
};
};
}
export default connect(mapStateToPropsFactory)(MyBlogs);
Run Code Online (Sandbox Code Playgroud) 嘿家伙我在windows dll上有一些快速的问题.
基本上我使用ifdef来处理dllexport和dllimport,我的问题实际上是关于dllexports和dllimports以及extern关键字的位置.
我将dllimports/dllexports放在头文件上,但是我必须将dllexport和dllimports放在实际定义上吗?
对于typedef怎么样?
我把dllimport/dllexport放在前面吗?如在
dllexport typedef map<string, int> st_map
Run Code Online (Sandbox Code Playgroud)
另外关于extern关键字,我看到它的使用方式如下:
extern "C" {
dllexport void func1();
}
Run Code Online (Sandbox Code Playgroud)
我也看到它被这样使用:
extern dllexport func1();
Run Code Online (Sandbox Code Playgroud)
一个包括"C"而另一个没有,我的问题是有什么区别,我需要使用它吗?如果我这样做,那么我将它用于dllexport和dllimport我是否必须在头文件声明和定义上使用它?
我的项目将是共享库,它包含我要导出的几个类文件,我想要导出的一些typdef和一些全局函数,我也想将它们全部导出到一个dll中.
有人赐教我吗?
编辑:
好吧,我想我会发布一些我已经完成的小提取物,还注意到我正在为linux和windows构建库,所以我做了一个检查:
mydll.h
#ifdef WINDOWS
# ifdef PSTRUCT_EXPORT
# define WINLIB __declspec(dllexport)
# else
# define WINLIB __declspec(dllimport)
# endif
#else
# define WINLIB
#endif
WINLIB void funct1();
Run Code Online (Sandbox Code Playgroud)
现在在源代码中:
mydll.cpp
#define PSTRUCT_EXPORT
void funct1() <---- do i need to add WINLIB in front of it?
Or is doing it in the header enough?
Run Code Online (Sandbox Code Playgroud) 我目前有一个基于meanjs堆栈样板的设置,我可以让用户登录这种"登录"状态,因为我浏览网站的URL.这是因为将用户对象保存在全局可用的服务中.
但是这只适用于我从我的基础导航,即从'/'导航,并仅在我的应用程序中导航.
如果我手动输入诸如'/ page1'之类的URL,它将丢失全局用户对象,但是如果我转到我的根主页并通过该站点导航到'/ page1'.然后没关系,它会在Service对象中看到全局用户对象.
所以我想这是因为整页刷新失去了全局值,在这里通过网站导航不会刷新,所以你保留所有的变量.
有些事情需要注意:
我只是想知道人们一般在这做什么?他们是否还原标准cookie和本地存储解决方案?我对角度很新,所以我猜这里有图书馆.
我只是想知道处理这个或大多数人做什么的推荐方法,所以我正确地以正确的方式和角度方式对齐.
更新:
如果我通过地址栏手动导航到我网站上的另一个URL,我将失去用户状态,但是如果我通过地址栏手动返回我的根目录,我的用户状态会再次出现,所以这不仅仅是关于失去状态在窗口刷新.所以它似乎与在根URL上运行的代码有关.
我有一个明确的重写,手动输入的URL(由于HTML5位置模式)应首先返回index.html,因为它包含AngularJs文件,然后UI-Route接管并正确路由它.
所以我原本预计root上的任何代码都会执行,所以它应该类似于通过站点导航或键入地址栏.我一定错过了具有这种效果的Angular.
更新2
对,所以更多的调查引导我这样:
<script type="text/javascript">
var user = {{ user | json | safe }};
</script>
Run Code Online (Sandbox Code Playgroud)
这是index.html的服务器端代码,我想这是通过手动URL将页面刷新到新页面时不运行的.
使用哈希爆炸模式,它是有效的,这是因为使用哈希爆炸模式,即使我在浏览器中键入URL,它也不会导致刷新,在使用HTML5模式时,它会刷新.所以现在我能想到的解决方案是使用sessionStorage.
除非有更好的选择?
更新3:
使用HTML5Mode时,处理此问题的最佳方法是,您只需要在快速服务器上重写一些其他内容.
javascript ×4
angularjs ×3
c++ ×3
node.js ×3
boost ×1
core-data ×1
distribution ×1
dll ×1
express ×1
ios ×1
meanjs ×1
mongoose ×1
objective-c ×1
protractor ×1
react-redux ×1
reactjs ×1
redux ×1
swift ×1
unit-testing ×1
webpack ×1
winston ×1