小编Mar*_*cus的帖子

使用依赖项链接动态库

请考虑以下情形:

  • 共享库libA.so,没有依赖项.
  • 共享库libB.so,libA.so作为其依赖项.

我想编译一个与libB链接的二进制文件.我应该仅将二进制文件与libB或libA链接?

有没有办法只链接直接依赖关系,让运算符的依赖关系解析未解析的符号?

我担心库libB实现将来可能会发生变化,引入其他依赖项(例如libC,libD,libE).我会遇到问题吗?

换一种说法:

  • libA文件:a.cpp啊
  • libB文件:b.cpp bh
  • 主程序文件:main.cpp

当然,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方法看起来好多了.

再次感谢.

dll dependencies gcc g++

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

写系统调用,什么是字节数限制?

写系统调用原型是:

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的写操作,则返回类型无法处理写入的实际字节数.

因此,能够传递无符号数量的字节并返回有符号数量的字节对我没有意义.为什么不通过签名号码?

感觉就像写入函数的原型一样容易出错,或者至少它在路径中留下了可能的漏洞.

有谁知道它的细节或在哪里可以找到这些信息?

c linux types

8
推荐指数
1
解决办法
4717
查看次数

使用reflection和ClassLoader创建类的实例时出现ClassCastException

首先,这是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)

java reflection classloader classcastexception

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

构造函数体中的auto_ptr成员初始化(不在初始化列表中)

我想知道在我的类的构造函数中初始化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)

c++ constructor auto-ptr

3
推荐指数
1
解决办法
2521
查看次数