ld -r 文件1.o 文件2.o 文件3.o -o 文件.o
你可能应该使用g++
链接,而不是调用ld
直接地。通过.o
将文件上传到 GCC 会导致它为您调用链接器,因此这是可行的:
g++ file1.o file2.o file3.o -o file.o
You say:
但我不知道如何将 .cpp 文件编译为 .o 文件。
你只需编译-c
(如果您想将目标文件放入共享库中,那么也-fPIC
):
g++ -c file1.cpp -fPIC -o file1.o
但我还必须为此命令提供静态库
不,因为命令-c
正在编译,而不是链接,因此您无法提供库,因为它们仅在链接时使用。
因此,我想要共享库,其中包含静态库 (libAlgatorc.a) 和所有三个 cpp 文件(file1.cpp、file2.cpp 和 file3.cpp)中的所有符号
那么你需要阅读我已经指出的答案:https://stackoverflow.com/a/2649792/981959 https://stackoverflow.com/a/2649792/981959
也许你应该阅读有关在类 UNIX 环境中构建软件的教程,也许类似海湾合作委员会简介 http://www.network-theory.co.uk/docs/gccintro/以便您了解所需的单独步骤以及每个命令的作用。
编译每个文件:
g++ -c -fPIC file1.cpp
g++ -c -fPIC file2.cpp
g++ -c -fPIC file3.cpp
(你不需要-o
此处的选项,默认情况下 GCC 将编译一个文件,例如file1.cpp
into file1.o
当你使用-c
选项。)
或者,您可以一步完成此操作:
g++ -c -fPIC file1.cpp file2.cpp file3.cpp
You can't使用-o
这里的选项,因为有三种不同的.o
作为输出生成的文件-c
步骤,因此您无法指定单个输出文件。
将它们全部链接到一个共享库中,该库还包含来自libAlgatorc.a
:
g++ file1.o file2.o file3.o -shared -o libProject.so -Wl,--whole-archive libAlgatorc.a -Wl,--no-whole-archive
或者在一个命令中编译所有三个文件,然后链接它们(注意没有-c
此处的选项):
g++ -fPIC file1.cpp file2.cpp file3.cpp -shared -o libProject.so -Wl,--whole-archive -lAlgatorc -Wl,--no-whole-archive
注意:说多了都是多余的-I /usr/local/include
or -L /usr/local/include
因为无论如何,默认情况下总是会搜索这些路径。
更简单的方法是编写 makefile:
libProjects.so: file1.o file2.o file3.o
$(CXX) -shared $^ -o $@ -Wl,--whole-archive -lAlgatorc -Wl,--no-whole-archive
file1.o file2.o file3.o : CXXFLAGS+=-fPIC
这就是 makefile 中所需的全部内容,因为 Make 已经知道如何创建file1.o
从输入file1.cpp
(并设置CXXFLAGS
为了.o
目标确保-fPIC
将在编译这些文件时使用)。由于您对执行此操作的正确命令没有信心,因此我建议您依靠 Make 来获得适合您的命令。