我有一个共享库,由我无法控制的另一个应用程序使用,需要*.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还是其他什么?
请参阅下面的代码.
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) 让我们有一段代码(fstream只是一个例子,我们可以谈论动态内存分配......):
fstream f;
try {
f.open("xxx");
...
f.close();
} catch (...) {
...
}
Run Code Online (Sandbox Code Playgroud)
当出现问题我想关闭()文件(释放内存或其他),但我不知道f的状态.毕竟,异常可能来自f.open().我认为在catch子句中调用f.close()是不安全的,因为我不能再相信f了.
f也可以是一个指向动态分配的数组的指针,我想删除[],但是谁知道抛出异常后它指向的位置...
这可能不是很常见,但是当我绝对无法承受任何额外伤害时,我该怎么办?
我可以考虑立即中止().
谢谢.
当初始化诸如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)
谢谢。
编辑:问题询问的是编码风格和最佳实践,而不是技术实现。
在测试公共构造函数调用时,我的应用程序中的JUnit测试会生成从未在测试方法中的任何位置使用的临时对象.编译器随后抱怨未使用的对象分配.有没有办法有选择地抑制所有JUnit测试的编译器警告?测试是在一个单独的包中.
我有一个Eclipse项目.所有测试用例都在一个*.cpp文件中.问题是这样我最终得到了两个main()函数.一个用于app本身,一个用于testcases.当然,Eclipse拒绝构建......我想在一个项目下将所有内容保存在一起(避免使用多个配置,SVN存储库等).理想情况下,我想强制Eclipse构建两个可执行文件(一个用于app,一个用于testcases).我快速浏览了Eclipse Makefile,但说实话,我不太清楚它是如何工作的.总是可以排除Main.cpp/Testcases.cpp并构建一个可执行文件,但它不是很优雅......
有类似经历的人吗?