如何分享我的C/C++项目并隐藏部分源代码?

6
我想分享我的C/C++项目(在Linux环境下使用gcc/g++编译器)作为共享库/静态库,而不实际分享源代码。这样其他用户就可以使用我的项目,而不必了解我的源代码。有人能告诉我如何将其共享为.so/.a格式吗?
假设我的项目如下所示:
main.cpp, source1.cpp, source2.cpp, source3.cpp, head1.h, Makefile 我如何通过隐藏文件source1.cpp、source2.cpp和source3.cpp的源代码并将其制作为共享库/静态库来分享这个项目?main.cpp文件包含main()函数。具体过程是什么?
PS:我是一个共享库/静态库的新手。

我需要分享哪些最基本的东西(例如头文件等)?你能给一个简单的例子吗? - thesukantadey
main.cpp 是否有 main 函数?如果有,它不能成为您的库的一部分。 - dbush
是的,它包含了主函数。 - thesukantadey
如果你有一个 main 函数,那么它不是一个库,而是一个程序。 - cdarke
@cdarke main.cpp 不是库文件。 - thesukantadey
显示剩余2条评论
3个回答

8
假设您有以下源文件:
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上链接/运行。 - dbush
好的,谢谢。那么我如何将上述源代码共享为静态库(.a文件)呢? - thesukantadey
分享源代码的话,可以创建一个包含它们的tar.Z文件。查询tar命令和compress命令。 - FredK
@FredK 我不想分享源代码,但可以作为一个库来使用。 - thesukantadey
我假设你说的“如何共享上述资源”是指这个问题。 - FredK

1
你需要从源文件创建对象文件。然后创建静态和/或共享库。你需要提供一个头文件以便与你的库一起使用。请注意,你的库不能包含main()函数。
请参见gcc详细说明

0
当然可以。只需提供库文件和对应源文件的头文件即可向使用者提供。

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