C语言 GNU g++ -G 选项,用于创建在 Solaris 上而不是在 Linux 上可用的共享库



我在SolarisLinux上使用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.ofile2.ofile3.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

相关内容

  • 没有找到相关文章

最新更新