0

g++ 4.9.2 compilerSolarisLinux. 在 Solaris 平台上,要从源文件 (ac) 创建共享库,我使用以下命令:

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++选择?

4

2 回答 2

1

在 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.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
于 2017-03-23T13:55:47.980 回答
1

g++ 文档是这样说的:

System V 第 4 版提供了这些附加选项,以便与这些系统上的其他编译器兼容:

-G 创建一个共享对象。建议改用 -symbolic 或 -shared。

通常,您也希望使用 -fPIC 标志为共享库生成与位置无关的代码。

所以你想运行:

g++ -fPIC -shared a.c -o liba.so
于 2017-03-23T13:46:44.747 回答