我的主机应用程序接管了来自动态库的FILE对象的所有权.fclose()即使我的宿主应用程序和动态库是使用不同版本的clang/gcc编译的,我是否可以安全地调用此对象?
在Windows上(具有不同的VS运行时),这将是非法的,我必须首先fclose()从动态库使用的运行时库中提取函数,因为所有运行时都有自己的池和文件或内存对象的内部结构.
Windows中的情况说明如下所示:
此限制是否也适用于Linux和macOS?
我将Python嵌入到应用程序中。用户通过以下方式安装软件包或模块时
{...}\myapp\python\python.exe setup.py install
Run Code Online (Sandbox Code Playgroud)
软件包将安装在
{...}\myapp\python\lib\site-packages
Run Code Online (Sandbox Code Playgroud)
Is there any chance to use another directory instead by default?
阅读执行Mach-O文件的Apple文档后,它说:
OS X v10.1及更高版本的两级命名空间功能将模块名称添加为其中定义的符号的符号名称的一部分.此方法可确保模块的符号名称与其他模块中使用的名称不冲突.
所以在我的例子中,我将python2和python3加载到同一个进程中.两个Python库(默认情况下)都是使用两级命名空间选项编译的.两个lib也RTLD_GLOBAL通过dlopen(..)加载了标志,因此具有相同名称的符号不应相互干扰,因为这两个模块具有不同的名称(python27和python36).
例:
#include <{...}/include/python2.7/Python.h>
int main(int argc, const char * argv[])
{
auto* py3 = dlopen(".../python36", RTLD_GLOBAL | RTLD_NOW);
if (py3 == nullptr)
return 0;
auto* py2 = dlopen(".../python27", RTLD_GLOBAL | RTLD_NOW);
if (py2 == nullptr)
return 0;
auto* init = ((decltype(Py_Initialize)*)dlsym(py2, "Py_Initialize"));
if (init)
{
init();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是,在python2导入之后/path/to/python2/lib/lib-dynload/_locale.so,调用PyModule_GetDictpython3中的函数.这是为什么?怎么会发生这种情况?两级命名空间不应该阻止吗?
PS lib-dynload是一个在macOS上具有Python附加C模块的目录.我验证_local.so了python2环境中正确的lib被加载了.
编辑:
在做了一些实验之后,我看到第一个加载的python lib的符号总是获得更高的优先级,但不确定它是否适用于第一个加载的库或仍然是"未定义的行为域".
调用python27的Py_Initialize() - 成功: …
我使用GetSystemIdForPublisher()来识别计算机 ID。根据文档,它们是唯一的,但我有一些机器返回相同的 ID。这些机器完全不相关,也没有共同的历史。它们位于不同的国家,属于不同的用户。这些机器的Windows版本是最新的Windows 190910.0.18363更新。
文档明确指出:
该方法将首先尝试使用可信平台模块 (TPM)(如果存在)来获取 ID。如果 TPM 不存在,该方法将尝试从统一可扩展固件接口 (UEFI) 获取 ID。如果这些源都不可用,则此方法将返回 Windows 注册表支持的 ID。对于 Windows 注册表,ID 将无法满足上述所有保证。例如,如果系统没有 TPM 或 UEFI 支持,因此从注册表获取 ID,则全新安装 Windows 将导致返回新的不同 ID。此方法的调用者应参考返回的 SystemIdentificationInfo 的 Source 属性来确定从何处获取 ID,以便了解所提供的保证。
据我所知,这些陈述都没有向我解释这里发生的事情。还有其他人知道发生了什么事吗?非常感谢任何帮助!
附录:
我们从 2 个不同大陆、具有相同机器 ID 的 2 个人那里得到了 cpu-z 报告形式的反馈:
用户A:
Mainboard Model Z87M Extreme4 (0x00000444 - 0xECE9B6D4)
UEFI Yes
BIOS Vendor American Megatrends Inc.
BIOS MSG 63-0100-000001-00101111-1xxxx5-Chipset
BIOS Date 12/10/15
Mainboard Vendor 000001
Run Code Online (Sandbox Code Playgroud)
用户B:
Mainboard Model 151-BE-E097 (0x0000025D - 0x0A74C7F0)
UEFI Yes …Run Code Online (Sandbox Code Playgroud) 我使用webpack 4和electro-builder来捆绑和构建我的 Electron 应用程序。我注意到node_modules应用程序包目录内的本机节点模块.asar仍然包含其 C++ 源文件。
有没有办法从构建步骤中排除某些文件扩展名?
我有时读到有些指令需要不到一个时钟周期 - 这怎么可能?或者这是游戏中出现流水线和乱序时的值?
我的问题是,可以设置Sublime 3来运行在Sublime中编写的代码.我已经在这里和互联网上搜索并尝试了许多不同的建议.如果答案已经发布,有人可以指出我正确的方向/ URL,我会很感激.如果它无法完成,你有其他建议,我会试一试.
当我想在没有底层操作系统的情况下编译二进制文件时,为什么需要裸机工具链?编译器有什么限制,除了缺少功能/功能外,因为没有OS / stdlibrary。可以将任何clang / gcc用作裸机编译器吗?我的目标是覆盆子2。
通常我git checkout -- foo.txt用来重置我的工作树中的特定文件。今天我不小心使用了git checkout foo.txt(没有--),它似乎也做了同样的事情。
$ git checkout -- foo.txt # no output
$ git checkout foo.txt
Updated 1 path from the index
Run Code Online (Sandbox Code Playgroud)
所以我想知道,这两者之间有什么区别?或者,有吗?
我有来自第三方库的两个结构,所以我不能改变它们的布局.但是我有两个我自己编写的结构符合它们的签名,所以我可以为它们添加函数(再次,但不是它们的布局,因此也没有虚函数).结构被称为Foo1和Foo2.两者都有相同的成员调用_b,但是在不同的偏移量.
struct FooBase { };
struct Foo1 : FooBase
{
int _a = 2;
int _b = 1;
};
struct Foo2 : FooBase
{
int _b = 2;
};
struct Wrap
{
Wrap(const FooBase& x) : _x(x) { }
FooBase& _x;
int GetValue() { return /* MISSING */; }
};
Run Code Online (Sandbox Code Playgroud)
我有一个名为的包装类Wrap.我正在寻找一种方法来返回_bfoo类中不使用虚函数的值,因为我不能再改变它们的大小了.
Foo1 f1 = Foo1();
Wrap x = f1;
int a = x.GetValue(); // should return 1
Foo2 …Run Code Online (Sandbox Code Playgroud) 我构建了一个 TypeScript 模块并将其推送到 GitHub。我现在想在我的内部使用这个模块MyApp作为依赖项,它也是用 TypeScript 编写的。该包已在我的中注册MyApp/package.json:
"dependencies": {
"foo": "github:organization-xyz/foo",
}
Run Code Online (Sandbox Code Playgroud)
我添加了一个命令build-ts来JavaScript在我的foo模块中创建相应的绑定foo/package.json:
"scripts": {
"build-ts": "tsc"
...
},
Run Code Online (Sandbox Code Playgroud)
当然,当我调用npm i主应用程序时,不会执行该命令。我如何正确准备我的模块foo才能将其成功导入到我的应用程序中?
macos ×3
python ×3
c++ ×2
clang ×2
gcc ×2
node.js ×2
python-3.x ×2
bare-metal ×1
c ×1
c++11 ×1
clock ×1
cpython ×1
cycle ×1
electron ×1
git ×1
git-checkout ×1
install ×1
instructions ×1
linux ×1
npm-install ×1
npm-publish ×1
npm-scripts ×1
python-2.7 ×1
raspberry-pi ×1
setup.py ×1
sublimetext3 ×1
typescript ×1
uwp ×1
webpack ×1
webpack-4 ×1
winapi ×1
windows ×1