2015-07-21 4 views
7

के साथ साझा लाइब्रेरी बनाएं शीर्षक की तरह ही, मैं तीन सीपीपी फ़ाइलों और कुछ स्थैतिक लाइब्रेरी से साझा लाइब्रेरी बनाना चाहता हूं।cpp फ़ाइलों और स्थिर लाइब्रेरी से g ++

मूल रूप से मैं क्या करना चाहते हैं यह

g++ libProject.so file1.cpp file2.cpp file3.cpp -I /usr/local/include -L /usr/local/lib -lAlgatorc 

यह मेरा file1.cpp है:

#include <iostream> 
#include <TestSetIterator.hpp> 

class SortingTestSetIterator : public TestSetIterator { 
public: 
    TestCase *get_current(){ 
     //TODO: implement method 
     return nullptr; 
    } 
}; 

यह मेरा file2.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 है। सीपीपी

#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 
    } 
}; 

मुझे लगता है कि मैं तीन ओ फ़ाइलें (file1.o file2.o file3.o) बना सकते हैं और फिर उन्हें इस

ld -r file1.o file2.o file3.o -o file.o 

की तरह गठबंधन जब मैं file.o है मुझे लगता है कि फिर मैं की जरूरत की जरूरत है कि यह कहने के लिए:

g++ -shared -o libProject.so file.o 

लेकिन मुझे नहीं पता कि .c फ़ाइलों में .cpp फ़ाइलों को संकलित कैसे करें। मैं जानता हूँ कि मैं इसे इस

g++ -std=gnu++11 -o file1.o -fPIC -c file1.cpp -I /usr/local/include 

की तरह कर सकते हैं लेकिन मैं यह भी, इस आदेश को स्थिर पुस्तकालय प्रदान करनी चाहिए क्योंकि file1.cpp (और अन्य फ़ाइलें) वर्ग कि/usr/स्थानीय/शामिल/TestSetIterator में परिभाषित किया गया है विरासत .hpp लेकिन /usr/local/lib/libAlgatorc.a में लागू किया गया है क्योंकि मैं नहीं कह सकता -L/usr/local/lib -lAlgatorc

अंत में, मैं इन तीनों की साझा लाइब्रेरी चाहता हूं कक्षाएं ताकि मुख्य कार्य में मैं इस पुस्तकालय को अपने कार्यक्रम में लोड कर सकूं और मैं इन तीन वर्गों से विधियों को कॉल कर सकता हूं। तो, मैं सभी तीन cpp फ़ाइलें (file1.cpp, file2.cpp और file3.cpp)

मैं Ubuntu 12.04 x64 उपयोग कर रहा हूँ स्थिर पुस्तकालय (libAlgatorc.a) से सभी प्रतीकों के साथ और से शेयर की गई लाइब्रेरी चाहते हैं।

> 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

क्या यह प्रश्न का एक डुप्पी नहीं है जिसे मैंने पहले ही आपको बताया है? http://stackoverflow.com/questions/2649735/how-to-link-static-library-into-dynamic-library-in-gcc –

+0

नहीं। स्थिर लाइब्रेरी और सीपीपी फ़ाइलों से साझा लाइब्रेरी का निर्माण नहीं किया गया है। केवल स्थिर लाइब्रेरी से साझा लाइब्रेरी का निर्माण किया जाता है। मैं यह दोनों संयुक्त चाहता हूँ। – golobich

+0

यह अभी भी मूल रूप से वही है। बस उस उत्तर में '.o' फ़ाइलों को कमांड में जोड़ें। मुद्दा यह है कि दूसरा उत्तर दिखाता है कि एक साझा लाइब्रेरी में एक स्थिर लाइब्रेरी से समाप्त होने वाले सभी प्रतीकों को कैसे सुनिश्चित किया जाए, जो वास्तव में आपकी समस्या है। –

उत्तर

14

ld -r file1.o file2.o file3.o -o file.o

आप शायद g++ का उपयोग करना चाहिए लिंक करने के लिए, ld सीधे फोन नहीं। जीसीसी के लिए .o फ़ाइलों पासिंग यह आप के लिए लिंकर आह्वान करने के लिए कारण होगा, तो यह काम करता है:

g++ file1.o file2.o file3.o -o file.o 

आप कहते हैं:

but I don't know how to compile .cpp files into .o files.

तुम बस -c (साथ संकलन और आप वस्तु डाल करना चाहते हैं किसी साझा लाइब्रेरी तो भी -fPIC) में दायर:

g++ -c file1.cpp -fPIC -o file1.o 

but I must also provide static library to this command

नहीं, क्योंकि -c के साथ एक कमांड संकलित है, लिंक नहीं कर रहा है, इसलिए आप पुस्तकालय प्रदान नहीं कर सकते हैं क्योंकि इन्हें केवल लिंक करते समय उपयोग किया जाता है।

So, I want shared library with all symbols from static library (libAlgatorc.a) and from all three cpp files (file1.cpp, file2.cpp and file3.cpp)

तो फिर तुम जवाब मैं पहले से ही करने के लिए आप इशारा पढ़ने की जरूरत है: https://stackoverflow.com/a/2649792/981959

शायद तुम इतना An Introduction to GCC की तरह कुछ यूनिक्स की तरह के वातावरण में सॉफ्टवेयर के निर्माण, हो सकता है पर एक ट्यूटोरियल पढ़ना चाहिए कि आप अलग समझते हैं कदमों की आवश्यकता है और प्रत्येक आदेश क्या करता है। (डिफ़ॉल्ट जीसीसी द्वारा आप यहाँ -o विकल्प की जरूरत नहीं है, file1.o में इस तरह के रूप file1.cpp एक फ़ाइल संकलन जब आप -c विकल्प का उपयोग करेगा।)

g++ -c -fPIC file1.cpp 
g++ -c -fPIC file2.cpp 
g++ -c -fPIC file3.cpp 

:

प्रत्येक फ़ाइल संकलन करने के लिए

वैकल्पिक रूप से, आप कर सकते हैं कि एक ही चरण में:

g++ -c -fPIC file1.cpp file2.cpp file3.cpp 

आप -o विकल्प का उपयोग कर सकते हैं, क्योंकि -c चरण के आउटपुट के रूप में उत्पादित तीन अलग-अलग .o फ़ाइलें हैं, इसलिए आप एक आउटपुट फ़ाइल निर्दिष्ट नहीं कर सकते हैं।

g++ file1.o file2.o file3.o -shared -o libProject.so -Wl,--whole-archive libAlgatorc.a -Wl,--no-whole-archive 

या एक भी आदेश है कि सभी तीन फ़ाइलें संकलन और फिर उन्हें लिंक करेगा (ध्यान दें में कोई -c विकल्प यहाँ है:

उन सब को एक साझा पुस्तकालय भी libAlgatorc.a से प्रतीकों शामिल है कि में लिंक करने के लिए):

g++ -fPIC file1.cpp file2.cpp file3.cpp -shared -o libProject.so -Wl,--whole-archive -lAlgatorc -Wl,--no-whole-archive 

एनबी यह -I /usr/local/include या -L /usr/local/include कहने के लिए अनावश्यक है क्योंकि उन पथों को हमेशा डिफ़ॉल्ट रूप से खोजा जाता है। ,

libProjects.so: file1.o file2.o file3.o 
     $(CXX) -shared $^ -o [email protected] -Wl,--whole-archive -lAlgatorc -Wl,--no-whole-archive 

file1.o file2.o file3.o : CXXFLAGS+=-fPIC 

यह सब आप makefile में की जरूरत है, क्योंकि मेक पहले से ही .o लक्ष्य सुनिश्चित के लिए इनपुट file1.cpp से file1.o (और स्थापित करने के लिए कैसे जानता है CXXFLAGS बनाने:

एक सरल तरीका एक makefile लिखने के लिए है उन फ़ाइलों को संकलित करते समय -fPIC का उपयोग किया जाएगा)। चूंकि आप ऐसा करने के लिए सही आदेशों पर भरोसा नहीं कर रहे हैं, इसलिए मैं सुझाव देता हूं कि आप इसे सही तरीके से प्राप्त करें।

+0

यदि मैं ऐसा करता हूं तो मुझे यह मिलता है: /usr/bin/ld : /usr/local/lib/libAlgatorc.a (पैरामीटरसेट.ओ): साझा वस्तु बनाते समय '.rodata.str1.1 'के विरुद्ध स्थानांतरण R_X86_64_32 का उपयोग नहीं किया जा सकता है; -पीपीआईसी /usr/local/lib/libAlgatorc.a (पैरामीटरसेट के साथ पुन: संकलित करें।ओ): प्रतीकों को नहीं पढ़ सका: खराब मूल्य संग्रह 2: त्रुटि: एलडी 1 निकास स्थिति लौटा दी – golobich

+0

इसका मतलब है कि 'libAlgator.ca' में ऑब्जेक्ट्स स्थानांतरित नहीं हैं और इसलिए साझा लाइब्रेरी में उपयोग नहीं किया जा सकता है। आपको या तो 'libAlgatorc' का एक नया संस्करण प्राप्त करने की आवश्यकता है जहां सामग्री '-fPIC' के साथ बनाई गई हो (शायद एक' .so' intead प्राप्त करें) या आप यह काम नहीं कर सकते हैं, और आपको अपने मुख्य निष्पादन योग्य को लिंक करना होगा 'libProject.so' –

+1

में इसे शामिल करने के बजाय' -lAlgatorc' बहुत बेहतर! वह आदेश 'g ++ -fPIC file1.cpp file2.cpp file3.cpp -shared -o libProject.so -Wl, - पूर्ण-संग्रह -lAlgatorc -Wl, - कोई-संपूर्ण-संग्रह एक आकर्षण की तरह काम कर रहा है! समस्या स्थिर lib में भी था। स्थैतिक lib -fPIC के साथ संकलित नहीं है लेकिन यह होना चाहिए, क्योंकि हम उन प्रतीकों को साझा लाइब्रेरी में जोड़ रहे हैं। सही जवाब वास्तव में! :) आपकी मदद के लिए धन्यवाद! – golobich

संबंधित मुद्दे