我在Solaris
和Linux
上使用GNUg++ 4.9.2 compiler
。 在 Solaris 平台上,要从源文件 (a.c) 创建共享库,请使用以下命令:
g++ -G a.c -o a
a
成为共享库a.c
包含以下代码:
void libfn1()
{
}
如果我尽量不使用 -G 选项,即编译为:
g++ a.c -o a
它得到一个链接器错误:Undefined Symbol main
但是,在Linux上,如果我做同样的事情:它说:
g++: error: unrecognized command line option -G
如何在 Linux 上创建共享库?g++
选择是什么?
g++ 文档是这样说的:
这些附加选项在系统 V 版本 4 上可用 与这些系统上的其他编译器的兼容性:
-G 创建一个共享对象。 建议将 -符号或 -shared 改为 改用。
通常,您还希望为共享库生成与位置无关的代码,并使用 -fPIC 标志。
所以你想运行:
g++ -fPIC -shared a.c -o liba.so
在 Linux 系统上创建共享库的过程略有不同。
Linux 上的共享库是.so
(用于"共享对象")文件,而不是.g
。
你这样做是这样的:
首先,您需要从C++源生成与位置无关的代码。这样,您的库就可以在调用的任何地方工作。为此,您应该使用 g++ 的-fPIC
标志。
因此,对于要包含在库中的每个源文件,应仅将其编译为与位置无关的代码。我们稍后会处理链接。
对于每个源文件:
g++ -c -fPIC file.cpp
(-c
标志告诉 g++ "编译,不要链接")。
对于每个file.cpp
,G++将生成file.o
,一个包含与位置无关的代码的对象文件。
然后,要将对象文件构建到共享库中,您应该使用
g++ -o -shared myLibrary.so {all_object_files}
所以如果你有file1.o
、file2.o
和file3.o
,命令将是:
g++ -shared -o myLibrary.so file1.o file2.o file3.o
当然,如果你有很多文件,这可能会变得非常乏味,所以你应该写一个 Makefile 来为你自动化这个过程!下面是一个示例:
myLibrary.so: file1.o file2.o file3.o
$(CXX) -shared $^ -o $@
file1.o file2.o file3.o : CXXFLAGS+=-fPIC