Создание общей библиотеки из cpp-файлов и статической библиотеки с помощью g++ [дубликат]
этот вопрос уже есть ответ здесь:
как и говорит название, я хочу создать общую библиотеку из трех файлов cpp и с некоторой статической библиотекой.
в основном я хочу сделать это
g++ libProject.so file1.cpp file2.cpp file3.cpp -I /usr/local/include -L /usr/local/lib -lAlgatorc
это мой файл1.cpp:
#include <iostream>
#include <TestSetIterator.hpp>
class SortingTestSetIterator : public TestSetIterator {
public:
TestCase *get_current(){
//TODO: implement method
return nullptr;
}
};
это мой файл2.cpp
#include<iostream>
#include<TestCase.hpp>
#include<Entity.hpp>
#include<ParameterSet.hpp>
class SortingTestCase : public TestCase {
public:
std::string print() {
//TODO: implement method
return "";
}
};
и это мой файл file3.cpp
#include <iostream>
#include <AbsAlgorithm.hpp>
#include "SortingTestCase.cpp"
class SortingAbsAlgorithm : public AbsAlgorithm {
private:
SortingTestCase Sorting_test_case;
public:
bool init (TestCase &test) {
//TODO: implement method
return true;
}
void run() {
//TODO: Implement method
}
void done() {
//TODO: Implement method
}
};
Я думаю, что мне нужно создать три .o файлы (file1.о файл2.о файл file3.o) а затем объединить их вот так
ld -r file1.o file2.o file3.o -o file.o
когда у меня есть файл.o я полагаю, что тогда мне нужно сказать следующее:
g++ -shared -o libProject.so file.o
но я не знаю как скомпилировать .cpp-файлы на .o файлы. Я знаю, что могу сделать это так
g++ -std=gnu++11 -o file1.o -fPIC -c file1.cpp -I /usr/local/include
но я должен также обеспечить статическая библиотека для этой команды, потому что file1.cpp (и другие файлы) наследует класс, определенный в /usr/local/include/TestSetIterator.ГЭС, но реализована в /usr/local/lib / libAlgatorc.a из-за-c я не могу сказать-L /usr/local/lib-lAlgatorc
в конце я хочу общую библиотеку этих трех классов, чтобы в main функции я мог загрузить эту библиотеку в свою программу и вызвать методы из этих трех классов. Итак, я хочу общую библиотеку со всеми символами из static библиотека (libAlgatorc.a) и из всех трех файлов cpp (file1.cpp, file2.cpp и file3.cpp)
я использую Ubuntu 12.04 x64.
> g++ --version
g++ (Ubuntu 4.8.1-2ubuntu1~12.04) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1 ответов
LD-r file1.о файл2.о файл file3.o-o файл.o
вы, вероятно, должны использовать g++
для связи, не звоните ld
напрямую. Проходя .o
файлы в GCC заставят его вызвать компоновщик для вас, поэтому это работает:
g++ file1.o file2.o file3.o -o file.o
вы говорите:
но я не знаю как скомпилировать .cpp-файлы на .o файлы.
вы просто компилируете с -c
(и если вы хотите поместить объектный файл в общую библиотеку тогда тоже -fPIC
):
g++ -c file1.cpp -fPIC -o file1.o
но я также должен предоставить статическую библиотеку этой команде
нет, потому что команда с -c
компилируется, а не связывается, поэтому вы не можете предоставлять библиотеки, потому что они используются только при связывании.
вы нужно прочитать ответ, на который я уже указал вам:https://stackoverflow.com/a/2649792/981959Итак, я хочу общую библиотеку со всеми символами из статической библиотеки (libAlgatorc.a) и из всех трех файлов cpp (file1.cpp, file2.cpp и file3.cpp)
возможно, вы должны прочитать учебник по созданию программного обеспечения в unix-подобных средах, возможно, что-то вроде введение в GCC так что вы понимаете отдельные шаги, необходимые и что делает каждая команда.
для компиляции каждого файла:
g++ -c -fPIC file1.cpp
g++ -c -fPIC file2.cpp
g++ -c -fPIC file3.cpp
(вам не нужно -o
параметры здесь, по умолчанию GCC будет компилировать файл такие как file1.cpp
на file1.o
при использовании .)
кроме того, вы можете сделать это в один шаг:
g++ -c -fPIC file1.cpp file2.cpp file3.cpp
вы не могу использовать -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
или в одна команда, которая скомпилирует все три файла, а затем свяжет их (обратите внимание, что нет здесь):
g++ -fPIC file1.cpp file2.cpp file3.cpp -shared -o libProject.so -Wl,--whole-archive -lAlgatorc -Wl,--no-whole-archive
N. B. излишне говорить -I /usr/local/include
или -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, чтобы получить его правильно для вас.