【问题标题】:Build a .so file from multiple C++ files and use it从多个 C++ 文件构建一个 .so 文件并使用它
【发布时间】:2017-08-24 01:13:40
【问题描述】:

我有一棵程序树,其中包含

outter.cc, outter.h b.cc, b.h c.cc, c.h

每个.cc 文件看起来像这样:

outter.cc

#include "b.h"
// do something

b.cc

#include "c.h"
// do something

c.cc

//do something

outer.cc 中是一堆 API 定义。我想生成一个 .so 文件,以便其他人在将他们的程序链接到这个 .so 文件时可以使用我的 API。

我的问题包括:

  1. 如何生成这个 .so 文件?我基本上是将所有代码“打包”到 .so 文件中

  2. 如果我设法生成了这个 .so 文件,如何使用它?假设我在另一个目录/home/xavier/test/ 中有一个main.cc 文件,并且在/home/xavier/test/ 中也有生成的.so 文件。我应该如何编写这个main.cc 以及我应该如何编译这个 main.cc 文件以使其使用我在 outter.cc 中定义的 API?

我正在使用 Mac OS X 和 g++

谢谢!

【问题讨论】:

    标签: c++ g++ shared-libraries


    【解决方案1】:

    如下的makefile:

    all:a.so
    
    a.so: outer.o b.o c.o
        g++ $^  -fPIC -shared -o $@
    %.o:%.cc
        g++ $< -I(your header file path) -c -o $@
    

    生成 .o 文件时不要忘记 -c 标志

    如果 liba.so 与 main.cc 在同一文件夹中,则可以

    g++ main.cc -la -o main
    

    main.cc 应该包含 outter.h b.h c.h

    或者你把 a.so 重命名为 liba.so 然后把它放到 /usr/lib/ 并运行g++ main.cc -la -o main

    【讨论】:

    • 如果outer.h API 旨在隐藏b.hc.h 的内部结构和类型,那么main.cc 将只需要#include &lt;outer.h&gt;
    • 感谢您的回答!还有一个问题!如果b.h, c.houtter.h 有不同的目录怎么办?我应该如何处理-I(your header file path)
    • @ConradParker 感谢您的 cmets。是的 outter.h 应该向 API 用户隐藏 b.hc.h 的详细信息。但是您能否更具体地说明“旨在隐藏内部结构和类型”?举个例子就好了。
    • 我刚试过你的方法。从我这边行不通。 1.应该是g++ $&lt; -I(your header file path) -c -o $@,你错过了-c标志。 2.我编译main.cc g++ main.cc -la -o main时,弹出这样的错误:fatal error: 'outter.h' file not found。我还需要将outter.h, b.h, c.h 放入/home/xavier/test 吗?
    • 对不起,我想念-c,并且致命错误:找不到'outter.h'文件,你可以 g++ main.cc -I(你的头文件路径) -la -o main
    猜你喜欢
    • 1970-01-01
    • 2021-06-18
    • 2013-04-09
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 2015-09-03
    • 1970-01-01
    相关资源
    最近更新 更多