请考虑以下情形:
我想编译一个与libB链接的二进制文件.我应该仅将二进制文件与libB或libA链接?
有没有办法只链接直接依赖关系,让运算符的依赖关系解析未解析的符号?
我担心库libB实现将来可能会发生变化,引入其他依赖项(例如libC,libD,libE).我会遇到问题吗?
换一种说法:
当然,b.cpp包含ah而main.cpp包含bh
编译命令:
g++ -fPIC a.cpp -c
g++ -shared -o libA.so a.o
g++ -fPIC b.cpp -c -I.
g++ -shared -o libB.so b.o -L. -lA
Run Code Online (Sandbox Code Playgroud)
我应该使用哪种波纹管选项?
g++ main.cpp -o main -I. -L. -lB
Run Code Online (Sandbox Code Playgroud)
要么
g++ main.cpp -o main -I. -L. -lB -lA
Run Code Online (Sandbox Code Playgroud)
我无法使用第一个选项.链接器抱怨库libA中未解析的符号.但这听起来有点奇怪.
非常感谢.
- 更新评论:
当我链接二进制文件时,链接器将尝试解析main和libB中的所有符号.但是,libB具有来自libA的未定义符号.这就是链接器抱怨的原因.
这就是我需要与libA联系的原因.但是我发现了一种忽略共享库中未解析符号的方法.看起来我应该使用以下命令行来做到这一点:
g++ main.cpp -o main -I. -L. -lB -Wl,-unresolved-symbols=ignore-in-shared-libs
Run Code Online (Sandbox Code Playgroud)
看起来仍然可以使用该-rpath选项.但是我需要更好地理解它.
有没有人知道使用该-Wl,-unresolved-symbols=ignore-in-shared-libs选项时可能存在的任何陷阱?
- 更新评论2:
-rpath不应该用于此目的.强制在给定目录中找到库是很有用的.这种-unresolved-symbol方法看起来好多了.
再次感谢.
写系统调用原型是:
ssize_t write(int fd, const void *buf, size_t count);
Run Code Online (Sandbox Code Playgroud)
count参数是无符号的,返回值是有符号的.
帮助页面说:
成功时,返回写入的字节数(零表示没有写入).出错时,返回-1,并errno进行适当设置.
但是,它没有说明count参数的限制是什么.当计数大于时,它仍然没有说出行为SSIZE_MAX.
考虑write是一个系统调用,可用于通用设备/文件/无论如何,如果设备支持大于SSIZE_MAX的写操作,则返回类型无法处理写入的实际字节数.
因此,能够传递无符号数量的字节并返回有符号数量的字节对我没有意义.为什么不通过签名号码?
感觉就像写入函数的原型一样容易出错,或者至少它在路径中留下了可能的漏洞.
有谁知道它的细节或在哪里可以找到这些信息?
首先,这是Java 1.4(项目限制).我正在尝试创建一个应用程序管理器.它使用自己的自定义类加载器实例加载每个应用程序的主类.之后,它使用反射创建主类的实例.每个应用程序都实现一个公共接口,因此在创建实例后,它会运行应用程序的预定义方法.
但是,我在CRASH POINT 1遇到了一些麻烦(见代码).该类不被视为其界面的一个实现.如果我为这个代码块做好准备,我会在CRASH POINT 2中得到ClassCastException.
我认为这两个错误都与同一个问题有关(当然).
谁能帮我?代码的相关部分如下(导入被删除)......
非常感谢.
马库斯
// AppManager.java
public class AppManager {
public ThreadGroup threadGroup;
private Class appClass;
private AppInstance appInst;
public AppContextImpl context;
private AppManager(CustomClassLoader cl, String mainClass) throws ClassNotFoundException {
final String className = mainClass;
final CustomClassLoader finalLoader = cl;
appClass = cl.loadClass(mainClass);
// DEBUG CODE:
Class[] k1 = AppInstance.class.getInterfaces();
System.out.println(k1.length + " interfaces for AppInstance.class:");
for (int ii = 0; ii < k1.length; ii++) {
System.out.println(" " + ii + " - …Run Code Online (Sandbox Code Playgroud) 我想知道在我的类的构造函数中初始化auto_ptr成员的正确方法.我的类有2个(或更多)不同类型的auto_ptr实例.并且其中一个的初始化取决于第一个初始化的结果.
澄清一下,这就是我正在做的事情:
class C1 {
...
}
class C2 {
...
}
class Holder {
private:
auto_ptr<C1> c1;
auto_ptr<C2> c2;
public:
Holder() :
c1(new C1()),
c2(NULL)
{
int x = this->c1->getGeneratedValue1();
int y = this->c1->getGeneratedValue2();
if (x > 0 && y > 0) {
auto_ptr<C2> lC2(new C2(true, 10));
this->c2 = lC2;
} else if (x > 0) {
auto_ptr<C2> lC2(new C2(false, 20));
this->c2 = lC2;
} else if (y > 0) {
auto_ptr<C2> lC2(new C2(false, 30));
this->c2 = lC2;
} …Run Code Online (Sandbox Code Playgroud) auto-ptr ×1
c ×1
c++ ×1
classloader ×1
constructor ×1
dependencies ×1
dll ×1
g++ ×1
gcc ×1
java ×1
linux ×1
reflection ×1
types ×1