将静态库与另一个静态库链接并在可执行文件中使用主库

3
在Eclipse中,我在Windows平台上使用MinGW编译器完成了以下操作 - C_proj.exe--->links---->libB_proj.a----->links---->libA_proj.a
其中:
  1. 在将A与B链接时,我只指定了libA_proj.a的路径(因为貌似不可能指定库名!)

  2. 在C中使用B时,我必须同时指定libA_proj.a和libB_proj.a。

代码 -
//a.h
    class a
    {
    public:
        void printA();
    };

//a.cpp    
    void a::printA()
    {
        std::cout<<"This is 'a'"<<std::endl;
    }
//b.h
    class b
    {
    public:
        void printB();
        void printA();
    };
//b.cpp
    void b::printB()
    {
        std::cout<<"This is 'B'"<<std::endl;
    }

    void b::printA()
    {
        std::cout<<"This is 'B'....calling A"<<std::endl;
        a objA;
        objA.printA();
    }

//c.cpp    
    int main()
    {
        b objB;
        objB.printB();
        objB.printA();
        return 0;
    }

现在我的需求是-- 我不想使用C exe将B和A链接起来。有没有一种方法只链接B和C,完成工作,这样我就可以向第三方提供仅包含B和C exe的文件呢?


肯定有方法,但我不知道如何使用你的工具来实现。在Visual Studio中这就是做法 - typ1232
@typ1232:我认为这假设.lib是一个DLL的thunk库。 - Mats Petersson
http://stackoverflow.com/questions/12198261/include-static-library-in-static-library - Derek
@typ1232 - 谢谢,伙计!!太棒了……就像涂了黄油一样顺畅!! :) 实际上我只在VStudio中工作……现在尝试在轻量级的Eclipse中使用它!! :D - Soumyajit Roy
1个回答

2
一个lib文件(或.a文件)是一组目标文件的集合,有点像zip文件,但没有压缩。因此,您实际上不能将一个lib文件与另一个lib文件链接起来。
您可以从两个较小的库中形成一个大型库 - 实质上是解压并重新打包为一个库。您可以使用 ar -x libfile.a 提取模块,然后可以使用 ar -a libfile2.a name1.o name2.o 将对象文件添加到新库中。
但是,我建议您告诉您的两个组件的用户链接两个库。这是更简单的解决方案。

[1] g++ -c a.cpp -o a.o [2] ar rcs liba.a a.o [3] g++ -c b.cpp -o b.o -L. -la [4] ar rcs libb.a b.o [5] g++ c.cpp -L. -lb -la ...........你能告诉我该怎么做吗?:( - Soumyajit Roy
是的,ar rcs liba.a a.o b.o - Mats Petersson
换句话说,您只需构建一个库而不是两个。没有办法通过“链接它们”将两个库合并为一个。您必须构建一个包含所有必要对象文件的库。如果由于某些后勤原因这不是一个好的解决方案,那么您需要在最终产品中链接到两个库。 - Mats Petersson
我明白你的意思了...尝试了你的解决方案。那个可行!谢谢... :) - Soumyajit Roy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接