在创建Ada DLL时,是否有一种简单的方法可以防止Ada名称被破坏?
这是我的.adb代码
with Ada.Text_IO;
package body testDLL is
procedure Print_Call is
begin
Ada.Text_IO.Put_Line("Hello World");
end Print_Call;
function Add_Nums(A,B : in Integer) return Integer is
begin
return A + B;
end Add_Nums;
end testDLL;
Run Code Online (Sandbox Code Playgroud)
我的.ads
package testDLL is
procedure Print_Call;
pragma export (dll, Print_Call, "Print_Call");
function Add_Nums(A,B : in Integer) return Integer;
pragma export (dll, Add_Nums, "Add_Nums");
end testDLL;
Run Code Online (Sandbox Code Playgroud)
我的python
import ctypes
TestDLL = ctypes.WinDLL ("libTestDLL.dll")
Print_Call = getattr(TestDLL, "Print_Call@0")
Print_Call()
Run Code Online (Sandbox Code Playgroud)
你可以看到我必须在函数名的末尾添加'@ 0',但是当我将相同的代码移动到不同的编译器时,这似乎会改变.这给我带来了一些问题.我需要一个标准的修改格式或一种方法来删除整个修改.
在我的开发环境中,我正在使用GNU C++ 3.4.6编译代码库.代码正在开发中,不幸的是偶尔崩溃.很高兴能够通过demangler运行回溯,我使用c ++ filt 3.4.当函数具有许多STL参数时,问题就来了.考虑
My_callback::operator()(
Status&,
std::set<std::string> const&,
std::vector<My_parameter*> const&,
My_attribute_set const&,
std::vector<My_parameter_base*> const&,
std::vector<My_parameter> const&,
std::set<std::string> const&
)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
当此函数在回溯中时,我平台上的错位输出是:
(_ZN30My_callbackclER11StatusRKSt3setISsSt4lessISsESaISsEERKSt6vectorIP13My_parameterSaISB_EERK17My_attribute_setRKS9_IP18My_parameter_baseSaISK_EERKS9_ISA_SaISA_EES8_+0x76a) [0x13ffdaa]
Run Code Online (Sandbox Code Playgroud)
c ++ filt巧妙地将其解析为
(My_callback::operator()(Status&, std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::vector<My_parameter*, std::allocator<My_parameter*> > const&, My_attribute_set const&, std::vector<My_parameter_base*, std::allocator<My_parameter_base*> > const&, std::vector<My_parameter, std::allocator<My_parameter> > const&, std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)+0x76a) [0x13ffdaa]
Run Code Online (Sandbox Code Playgroud)
这与使用模板时遇到的编译器错误相同.但是,STL是一个相当规则且可识别的模板包.所以我希望有人在那里创建了一个增强版的c …
通常使用相同的标识符(如变量名称)作为同一范围内的另一个变量之类的东西会通过编译器生成错误.是否有任何技术实际向编译器指示在此范围内此特定点此名称有其自己的用途并且是用来引用这个变量,但是在这一点之后,同一个名称会引用另一个其他目的的另一个变量吗?
我可以想象var
一个函数内的静态变量func
被命名为var@func
,
全局静态和非静态变量呢?
我在ASP.NET中有一些用户控件,我使用的只是HTML,也就是说,没有任何代码隐藏.
我有一个控件,我有一个具有固定ID的元素,我用一些jQuery客户端脚本指向它.例如:
<div id="slider-section"></div>
<script type="text/javascript" language="javascript">
$(document).ready(function () {
var slider = $('#slider-section');
// ... do something with the jQuery Object
});
</script>
Run Code Online (Sandbox Code Playgroud)
这非常好,没有任何问题.但是这有副作用.事实上,如果我在我的页面上添加两个相同用户控件的实例,我将有两个具有相同ID的元素.
您认为哪种方法可以处理这种情况?
谢谢
我在C++中看到了关于动态链接的这篇文章.
我们可以创建一个C++工厂,它将返回我们感兴趣的类的对象.此外,我们应该在工厂的文件范围内创建一个静态对象,以便可以使用它来定位它dlsym()
.(文章建议静态对象不会受到名称损坏.)
为什么静态对象没有名称损坏?
我有一个标题,我想包含.c和.cpp文件.
所以我知道名字错误和外部"C"所以......
#ifdef __cplusplus
extern "C"
{
int isPrime(int64_t p);
}
#endif
Run Code Online (Sandbox Code Playgroud)
但是当我在.c文件中包含它时,由于它没有看到该函数 #ifdef __cplusplus
所以我最终制作了2份:
#ifdef __cplusplus
extern "C"
{
int isPrime(int64_t p);
}
#else
int isPrime(int64_t p);
#endif
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点...我想要制作另一个名为prototypes.h的标题,并将其包含在那两个地方......但是我有什么简单的遗漏吗?
我目前正在尝试编译 CppUTest 库并将其与我的项目链接。我使用 CMake 为 CppUTest 库创建了一个 Visual Studio 2013 解决方案并构建了它。
但是,当我将创建的 CppUTest.lib 链接到我的应用程序时,我收到一个链接器错误,告诉我它找不到多个符号,例如
??0Utest@@QAE@XZ)
或者
?RunAllTests@CommandLineTestRunner@@SAHHPAPAD@Z
现在,当我在 lib 和选项 /LINKERMEMBER 上使用 dumpbin.exe 时,我会得到库中包含名称的符号列表
??0Utest@@QEAA@XZ
和
?RunAllTests@CommandLineTestRunner@@SAHHPEAPEAD@Z
所以实际存在的名称与我的项目期望的名称略有不同,我不知道是什么导致了这个问题。是否有任何编译选项会导致这些更改,或者我是否使用不同的编译器,尽管我认为它是相同的?
class Parent {
public:
virtual void Foo() {}
virtual void FooNotOverridden() {}
};
class Derived : public Parent {
public:
void Foo() override {}
};
int main() {
Parent p1, p2;
Derived d1, d2;
}
Run Code Online (Sandbox Code Playgroud)
(gdb) x/300xb 0x400b30
Run Code Online (Sandbox Code Playgroud)
0x400b30
是d vtable的第一个地址.
0x400b30 <_ZTV7Derived>: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x400b38 <_ZTV7Derived+8>: 0x80 0x0b 0x40 0x00 0x00 0x00 0x00 0x00
0x400b40 <_ZTV7Derived+16>: 0x60 0x0a 0x40 0x00 0x00 0x00 0x00 0x00
0x400b48 <_ZTV7Derived+24>: 0x70 0x0a …
Run Code Online (Sandbox Code Playgroud) 我试图func
用C++样式函数覆盖库中的C风格函数(),接受不同的参数,如下面的代码所示.
我将test.cpp编译成共享库libtest.so,并编译main.cpp并将其与libtest.so库链接.这一切都有效,直到我得到的链接步骤
undefined reference to 'func(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
.
有人可以解释为什么链接器无法解析C++函数?我用nm检查了两个函数确实在库中.使用intel和g ++编译器时会发生链接器错误.
test.h:
extern "C" {
int func( char* str, int size );
}
#include <string>
int func( std::string str );
Run Code Online (Sandbox Code Playgroud)
TEST.CPP:
#include <stdio.h>
#include <string>
#include "test.h"
int func( char *buf, int size )
{
return snprintf( buf, size, "c-style func" );
}
int func( std::string& str )
{
str = "c++-style func";
return str.size();
}
Run Code Online (Sandbox Code Playgroud)
main.cpp中:
#include <iostream>
#include <string>
#include "test.h"
int main()
{
char …
Run Code Online (Sandbox Code Playgroud)