小编Pet*_*etr的帖子

C++静态链接共享库

我有一个共享库,由我无法控制的另一个应用程序使用,需要*.so对象.我的库使用sqlite3,它需要与它静态链接(我绝对需要一个自包含的二进制文件).

当我尝试编译和链接我的库时:

-fpic -flto -pthread -m64
-flto -static -shared
Run Code Online (Sandbox Code Playgroud)

我最终得到以下错误:

/usr/bin/ld: /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtbeginT.o: relocation R_X86_64_32 against `__DTOR_END__' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtbeginT.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

什么是与-fPIC相关的重新编译?我的代码还是CRT?

我已经尝试用-fPIC编译我的对象,结果相同.

谢谢.

编辑:

这个问题似乎与SQLite3无关.

我写了一个简单的单行无用库,它编译和链接如下:

g++ -c -fPIC -o bar.o bar.cpp
g++ -shared -o bar.so bar.o
Run Code Online (Sandbox Code Playgroud)

但不是这样的:

g++ -c -fPIC -o bar.o bar.cpp
g++ -static -shared -o bar.so bar.o
Run Code Online (Sandbox Code Playgroud)

问题似乎与CRT(crtbeginT.o)有关.我应该重新编译GCC - 用pic还是其他什么?

c++ crt static-libraries dynamic-library

26
推荐指数
2
解决办法
3万
查看次数

C++ static_cast运行时开销

请参阅下面的代码.

a)在这种情况下(简单继承,没有虚拟成员),B :: df()中的静态强制转换是否有任何开销(无论如何)?我找到了类似问题的一些相互矛盾的答案,这就是我要问的原因......

b)我正在考虑const M1 * func在A中私有化并在B中引入一个新的私有字段const M2 * func来避免演员表,但它使事情变得复杂并且更难以使用智能指针.你有没有看到避免演员的更好方法?


class M1 {
public:
    double f() const;
};

class M2 : public M1 { public: double df() const; };

class A { protected: const M1 * func; public: A(const M1 * p); ~A(); double f() const; };

class B : public A { public: B(const M2 * p); double df() const; };


double M1::f() const { return 1973.0; }
double M2::df() const { return 0.0; …
Run Code Online (Sandbox Code Playgroud)

c++ runtime overhead static-cast

19
推荐指数
1
解决办法
9887
查看次数

C++安全异常处理

让我们有一段代码(fstream只是一个例子,我们可以谈论动态内存分配......):


fstream f;
try {
f.open("xxx");
    ...
f.close();
} catch (...) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

当出现问题我想关闭()文件(释放内存或其他),但我不知道f的状态.毕竟,异常可能来自f.open().我认为在catch子句中调用f.close()是不安全的,因为我不能再相信f了.

f也可以是一个指向动态分配的数组的指针,我想删除[],但是谁知道抛出异常后它指向的位置...

这可能不是很常见,但是当我绝对无法承受任何额外伤害时,我该怎么办?

我可以考虑立即中止().

谢谢.

c++ security exception

7
推荐指数
2
解决办法
909
查看次数

原语的直接初始化与复制初始化

当初始化诸如int或 指针之类的基本类型时,可以使用复制初始化直接初始化

int a = 10;
int b(10);
Run Code Online (Sandbox Code Playgroud)

尽管后一种方式更适合具有构造函数的对象,但我没有看到人们将它用于基元。我知道使用“=”运算符有点“更自然”(尤其是对于数字),但是有人在现实生活中编写类似代码的东西吗:

for (int i(0); i < 5; ++i) {
    cout << i << endl;
}
Run Code Online (Sandbox Code Playgroud)

谢谢。

编辑:问题询问的是编码风格和最佳实践,而不是技术实现。

c++ primitive initialization variable-assignment

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

在JUnit测试中禁止编译器警告

在测试公共构造函数调用时,我的应用程序中的JUnit测试会生成从未在测试方法中的任何位置使用的临时对象.编译器随后抱怨未使用的对象分配.有没有办法有选择地抑制所有JUnit测试的编译器警告?测试是在一个单独的包中.

java eclipse junit compiler-warnings

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

gTest和多个main()

我有一个Eclipse项目.所有测试用例都在一个*.cpp文件中.问题是这样我最终得到了两个main()函数.一个用于app本身,一个用于testcases.当然,Eclipse拒绝构建......我想在一个项目下将所有内容保存在一起(避免使用多个配置,SVN存储库等).理想情况下,我想强制Eclipse构建两个可执行文件(一个用于app,一个用于testcases).我快速浏览了Eclipse Makefile,但说实话,我不太清楚它是如何工作的.总是可以排除Main.cpp/Testcases.cpp并构建一个可执行文件,但它不是很优雅......

有类似经历的人吗?

c++ eclipse googletest

4
推荐指数
2
解决办法
3708
查看次数