Создание общей библиотеки из 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 компилируется, а не связывается, поэтому вы не можете предоставлять библиотеки, потому что они используются только при связывании.

Итак, я хочу общую библиотеку со всеми символами из статической библиотеки (libAlgatorc.a) и из всех трех файлов cpp (file1.cpp, file2.cpp и file3.cpp)

вы нужно прочитать ответ, на который я уже указал вам:https://stackoverflow.com/a/2649792/981959

возможно, вы должны прочитать учебник по созданию программного обеспечения в 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, чтобы получить его правильно для вас.