小编ifn*_*ull的帖子

当调试符号被分割成 dwo dwarf 文件时,gdb 找不到符号

我想构建一个二进制文件并将g++调试信息拆分到一个单独的文件中。所谓的DebugFission

假设您位于一个文件夹中。有一个src/main.cpp内容很简单的文件:int main() {}

我想使用以下方法编译它-gsplit-dwarf

mkdir -p obj
(cd obj && g++ -c -g -gsplit-dwarf ../src/main.cpp -o main.o)
g++ -Wl,--gdb-index -fuse-ld=gold  obj/*.o -o main
Run Code Online (Sandbox Code Playgroud)

我想在main函数中设置一个断点:

gdb main
(gdb) b main
Breakpoint 1 at 0x40058a: file ../src/main.cpp, line 2.
(gdb) r
Breakpoint 1, main () at ../src/main.cpp:2
2       ../src/main.cpp: No such file or directory.
Run Code Online (Sandbox Code Playgroud)

gdb找不到符号。它尝试查找与obj目录相关的符号。

我错过了一些论点吗?

我使用以下版本:gcc-4.9.3, binutils-2.26.1,gdb-7.11.1

一些额外的信息

readelf …
Run Code Online (Sandbox Code Playgroud)

c++ linux linker gdb

6
推荐指数
0
解决办法
1329
查看次数

返回对成员变量的引用时的 SWIG-Java 内存管理

我正在使用 SWIG 从 Java 访问 C++ 代码。

C++ 中的 getter 通常返回 const 引用:

class B
{
public:
  const A& getA() const { return a_; }
private:
  A a_;
};
Run Code Online (Sandbox Code Playgroud)

生成 SWIG 包装器。B::getA在 Java 中按预期返回引用。然而 JVM 不知道这个引用与class B. 它可能会导致引用损坏:

public A createA() {
    B b = new B();
    return b.getA();
}
Run Code Online (Sandbox Code Playgroud)

createA一旦垃圾收集器销毁B b并且JVM对此一无所知,则返回的对象无效。

SWIG 提供了解决此问题的文档:references 和 swig。但这意味着我需要手动添加所有这些引用。

我想出了以下解决方案,它在 SWIG 生成的代码中返回副本而不是 const 引用:

%typemap(out) const SWIGTYPE&
{
  *($&1_ltype)&$result = new $1_basetype(($1_type)*$1);
}
%typemap(javaout) …
Run Code Online (Sandbox Code Playgroud)

c++ java swig

5
推荐指数
1
解决办法
766
查看次数

增强单位的平方根scaled_unit

boost::units用来处理项目中的单位.

我创建了一个缩放单元来存储微米:

using namespace boost::units;
typedef make_scaled_unit<si::length,
                         scale<10, static_rational<-6> > >::type micro_meter_unit;
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作:

quantity<si::length, double> some_meter = 10 * si::meter;
quantity<micro_meter_unit, double> some_mu_meter = 
  static_cast<quantity<micro_meter_unit, double>>(some_meter);

std::cout << "some_meter^2 = " << some_meter * some_meter;  // outputs 100 m^2
std::cout << "some_mu_meter^2 = " << some_mu_meter * some_mu_meter; // outputs 1e+014 p(m^2)
Run Code Online (Sandbox Code Playgroud)

然而,平方根操作未编译:

std::cout << "sqrt(some_meter) = " << sqrt(some_meter); // outputs 3.16228 m^(1/2)
std::cout << "sqrt(some_mu_meter) = " << sqrt(some_mu_meter); //error here
// 'value' : is not …
Run Code Online (Sandbox Code Playgroud)

c++ boost

5
推荐指数
1
解决办法
642
查看次数

标签 统计

c++ ×3

boost ×1

gdb ×1

java ×1

linker ×1

linux ×1

swig ×1