我想构建一个二进制文件并将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) 我正在使用 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) 我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)