【问题标题】:How do I share my C/C++ project and hide some of the source code?如何共享我的 C/C++ 项目并隐藏一些源代码?
【发布时间】:2018-02-01 20:41:39
【问题描述】:

我想分享我用 C/C++(Linux 环境 gcc/g++ 编译器)编写的项目作为共享库/静态库,而不实际共享源代码。这样其他用户就可以在不知道我的源代码的情况下使用我的项目。谁能告诉我如何以 .so/.a 格式共享它?

假设,我的项目看起来像:

ma​​in.cppsource1.cppsource2.cppsource3.cpphead1.h制作文件

如何通过隐藏文件 source1.cppsource2.cppsource3.cpp 的源代码来共享此项目以及使它们成为共享库/静态库。 ma​​in.cpp 文件包含 main() 函数。告诉我详细的过程。

PS:我是共享库/静态库的新手。

【问题讨论】:

  • 我最少需要分享哪些内容(例如头文件等)?能举个简单的例子吗?
  • 为了让它有任何用途,你需要有公开的头文件来公开你的库提供的基本功能。所有其他细节都可以隐藏在预编译的二进制文件中
  • main.cppmain 功能吗?如果是这样,它就不能成为您图书馆的一部分。
  • 是的,它包含主要功能。
  • 如果你有一个main 那么它不是一个库,它是一个程序。

标签: c++ c unix shared-libraries static-libraries


【解决方案1】:

假设你有以下源文件:

mylib.c:

#include <stdio.h>

void my_print(int i)
{
    printf("i=%d\n", i);
}

这个的公共标头是:

mylib.h:

#ifndef MYLIB_H
#define MYLIB_H

void my_print(int i);

#endif

然后您可以像这样构建库:

gcc -g -Wall -Wextra -c mylib.c
gcc -g -Wall -Wextra -shared -fPIC -o libmylib.so mylib.o

然后您可以将 libmylib.so 和 mylib.h 分发给用户。然后可以像这样在他们的代码中使用它:

user_prog.c:

#include "mylib.h"

int main()
{
    my_print(5);
    return 0;
}

然后他们会将 libmylib.so 放入 /usr/lib 或 /usr/local/lib 之类的地方,然后像这样编译:

gcc -g -Wall -Wextra -o user_prog user_prog.c -l mylib

对于您的特定情况,假设 head1.h 包含公共接口和 source1.cpp source2.cpp source3.cpp 库,您可以这样编译:

g++ -g -Wall -Wextra -c source1.cpp
g++ -g -Wall -Wextra -c source2.cpp
g++ -g -Wall -Wextra -c source3.cpp
g++ -g -Wall -Wextra -shared -fPIC -o libmylib.so source1.o source2.o source3.o

【讨论】:

  • 谢谢。还有一件事,生成的共享对象 libmylib.so 将取决于机器/编译器版本?
  • @thesukantadey 这将取决于机器/操作系统。例如,如果您在 Linux x86_64 上编译,则可以在任何 Linux x86_64 上链接/运行。
  • 好的,谢谢。以及如何将上述源代码共享为静态库(.a 文件)?
  • 要共享源代码,请创建一个包含它们的 tar.Z。查找 tar 命令和 compress 命令。
  • @FredK 我不想分享源代码,而是作为一个库。
【解决方案2】:

您需要从源文件创建目标文件。然后创建静态和/或共享库。您将需要提供一个用于您的库的头文件。请注意,您的库不得包含 main()。

detailed instructions for gcc

【讨论】:

    【解决方案3】:

    当然可以。只需向人们提供库文件和与用于构建库的源文件相对应的头文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多