草庐IT

dynamic-linking

全部标签

c++ - 为什么这个来自Objective-C++的dynamic_cast调试成功但发布失败?

我在最新版本的Xcode(撰写本文时为9.4.1)中构建了一个C++框架,我再次在Xcode中从Objective-C++代码中使用它。我需要执行从一种指针类型到另一种指针类型的dynamic_cast。但是,dynamic_cast仅适用于调试版本,不适用于发布版本。关于dynamic_cast在Objective-C++中的工作方式,我是否缺少或理解导致此示例失败的某些内容?C++框架TestClass.hppclassParent{public://https://stackoverflow.com/a/8470002/3938401//musthaveatleast1virtu

c++ - 重复符号链接(symbolic link)器错误(C++ 帮助)

我现在正在学习一些CSP(约束满足)理论,并且正在使用this解析XML文件的库。我将Xcode用作IDE。我的程序编译正常,但当它链接文件时,我收到XMLParser_libxml2.hh文件的重复符号错误。我的文件是这样分开的:包含上述XMLParser文件的类头文件包含类头文件的类实现文件包含类头文件的主文件重复符号出现在main.o和classfile.o中,但据我所知,我实际上并没有两次添加该.hh文件。完整错误:ld:duplicatesymbolboolCSPXMLParser::UTF8String::to,std::allocator>>(std::basic_str

c++ - 创建 C++ API 库

我试图了解为非开源项目提供相当大的C++API的正确方法或正确方法。我不想提供“仅header”库,因为代码库相当大并且是封闭源代码。目标如下:提供本地C++API,用户可以实例化C++类,传递数据,全部使用C++,无需仅使用C语言的包装器允许方法作为参数并返回C++对象,尤其是STL类型(std::string、std::vector等)没有自定义分配器如果存在这样的标准,大多数行业标准/规范方法都可以做到这一点无需重新创建COM或使用MSCOM假设所有C++编译器都至少符合C++11标准我的目标是Windows以及其他平台(Linux)。我的理解是创建DLL或共享库是不可能的,因为

c# - 与 COM 中的 QueryInterface 或 C++ 中的 dynamic_cast 相比, "as"的成本是多少?

我仍在尝试将我深厚的旧知识从C/C++映射到我较浅的.Net知识。今天是时候在C#中使用“as”(隐含地“is”和cast)了。我对“as”的心理模型是,它是一个QueryInterface或dynamic_cast(一个带有指针参数的dynamic_cast,而不是引用,也就是说)对于C#。我的问题有两个方面:我的比较公平吗?与QueryInterface或dynamic_cast相比,“as”的相对成本是多少? 最佳答案 是的,比较是公平的,尤其是在处理指针时。这三个中的每一个要么成功并返回目标类型的非空指针,要么返回null。

c++ - 与位置无关的代码和 vtable

如何在位置无关代码中实现虚函数?我知道如果我的类有虚函数,编译器通常会为它生成一个vtable,其中包含所有虚函数的地址,并在我的类的每个对象中存储一个指向vtable的指针。现在,如果我的代码是位置无关的,编译器就无法知道虚函数(或任何函数)的地址。那么它有什么作用呢?我想知道真正的编译器做了什么(不是理论上可能的);我最感兴趣的是linux32位平台,但其他平台也有一些兴趣。 最佳答案 有两种选择:接受您的vtable不会与位置无关,并尝试将其从代码部分移开,以便所有需要动态链接修复的代码彼此相邻,以减少不可共享页面的数量。gc

c++ - 使用 `dlopen` 重新加载运行时库

这个问题在这里已经有了答案:Updatesharedlibrarieswithoutrestartingprocesses(8个答案)关闭4年前。正在运行的基于c++的进程是否可以使用dlopen重新加载基于c++的动态库。正在运行的进程轮询动态库的新版本(具有相同的API)。一旦检测到此类文件,就会发生以下一组操作:使用dlclose卸载旧库复制较新的dylib并覆盖旧版本的文件。该进程使用dlopen从该位置加载较新版本根据新加载的库中的dlsym设置函数指针变量。在最后阶段,我实际上得到了所需的API,并将其放在我的主代码中的函数指针中,以备后用。但是,似乎我的程序在第三阶段后意

c++ - dynamic_cast 真的适用于多重继承吗?

我想看看是否可以创建“接口(interface)”,继承它们,然后在运行时检查是否有任何随机类实现了该接口(interface)。这是我的:structGameObject{intx,y;std::stringname;virtualvoidblah(){};};structAirholder{intoxygen;intnitrogen;};structTurf:publicGameObject,publicAirholder{Turf():GameObject(){name="Turf";}voidblah(){};};voidremove_air(GameObject*o){Air

C++11 Dynamic Cast If Else Chain -> 开关

考虑以下几点:structB{};templatestructD:B{Tt;}voidg(inti){...}voidg(strings){...}voidg(charc){...}voidf(B*b){if(dynamic_cast*>(b)){g(dynamic_cast*>(b)->t);}elseif(dynamic_cast*>(b)){g(dynamic_cast*>(b)->t);}elseif(dynamic_cast*>(b)){g(dynamic_cast*>(c)->t)}elsethrowerror;};这里只有三种可能的T类型——int、string、char

c++ - g++ : can't link with a main executable file

我正在开发一个使用统计攻击来破解wepkey的应用程序。当我用我的makefile编译时(如上)我得到这个错误:ld:can'tlinkwithamainexecutablefile'execStatAttack'forarchitecturex86_64clang:error:linkercommandfailedwithexitcode1(use-vtoseeinvocation)make:*[statAttack]Error1我的项目包含那些文件:statAttack.cpp:包含主要功能,使用上面的文件rc4.h+rc4.cpp:具有那些功能#include#include#i

c++ - 函数指针赋值在 C 中有效,但在 C++ 中无效

我需要在MacOSX的运行时动态链接到库函数。关注Apple'sexample,我声明了一个函数指针并用dlsym()的结果赋值给它。以下示例成功编译为纯C(.c)文件。但我需要在C++文件中使用它,如果我将此示例编译为C++文件(.cpp),clang编译器会告诉我无法使用“void”类型的右值初始化“void()(char*)”类型的变量为什么它在纯“C”中工作,我该如何解决这个问题?#includevoidTest(){//LoadthelibrarywhichdefinesmyFuncvoid*lib_handle=dlopen("myLib.dylib",RTLD_LOCAL