पर लिनक्स और मिनीजीडब्ल्यू पर जीसीसी का उपयोग करके साझा लाइब्रेरी का निर्माण करना मुझे एक बिल्ड सेटअप बनाने में परेशानी हो रही है जो क्रमशः जीसीसी और मिनजीडब्ल्यू का उपयोग करके लिनक्स और विंडोज दोनों में साझा पुस्तकालयों को निर्मित करने की अनुमति देता है। लिनक्स में, साझा लाइब्रेरी को संकलन समय पर सभी निर्भरताओं को हल करने की आवश्यकता नहीं होती है; जबकि, यह विंडोज़ में इस मामले में प्रतीत होता है।विंडोज
$ cat foo.h
#ifndef FOO_H
#define FOO_H
void printme();
#endif
$ cat foo.c
#include "foo.h"
#include <stdio.h>
void printme() {
printf("Hello World!\n");
}
$ cat bar.h
#ifndef BAR_H
#define BAR_H
void printme2();
#endif
$ cat bar.c
#include "bar.h"
#include "foo.h"
void printme2() {
printme();
printme();
}
$ cat main.c
#include "bar.h"
int main(){
printme2();
}
: यहाँ समस्या सेटअप है
$ cat Makefile
.c.o:
gcc -fPIC -c $<
all: foo.o bar.o main.o
gcc -shared foo.o -o libfoo.so
gcc -shared bar.o -o libbar.so
gcc main.o -Wl,-rpath=. -L . -lbar -lfoo -o main
अब, लिनक्स में, इस संकलित करता है तथा ठीक चलाता है:
$ make
gcc -fPIC -c foo.c
gcc -fPIC -c bar.c
gcc -fPIC -c main.c
gcc -shared foo.o -o libfoo.so
gcc -shared bar.o -o libbar.so
gcc main.o -Wl,-rpath=. -L . -lbar -lfoo -o main
$ ./main
Hello World!
Hello World!
विंडोज में, हम dll, जो बहुत ही कम हो ताकि बदलने की जरूरत है और ठीक:
$ cat Makefile
.c.o:
gcc -fPIC -c $<
all: foo.o bar.o main.o
gcc -shared foo.o -o libfoo.dll
gcc -shared bar.o -o libbar.dll
gcc main.o -Wl,-rpath=. -L . -lbar -lfoo -o main
हालांकि, जब हम निर्माण करने का प्रयास करते हैं, तो हमें निम्न त्रुटि मिलती है:
$ make
gcc -fPIC -c foo.c
foo.c:1:0: warning: -fPIC ignored for target (all code is position independent) [enabled by default]
gcc -fPIC -c bar.c
bar.c:1:0: warning: -fPIC ignored for target (all code is position independent) [enabled by default]
gcc -fPIC -c main.c
main.c:1:0: warning: -fPIC ignored for target (all code is position independent) [enabled by default]
gcc -shared foo.o -o libfoo.dll
gcc -shared bar.o -o libbar.dll
bar.o:bar.c:(.text+0x7): undefined reference to `printme'
bar.o:bar.c:(.text+0xc): undefined reference to `printme'
collect2.exe: error: ld returned 1 exit status
make: *** [all] Error 1
अब, हम बस libbar.dll में foo.o से वस्तुओं को शामिल करके त्रुटि को ठीक कर सकते हैं:
$ cat Makefile
.c.o:
gcc -fPIC -c $<
all: foo.o bar.o main.o
gcc -shared foo.o -o libfoo.dll
gcc -shared bar.o foo.o -o libbar.dll
gcc main.o -Wl,-rpath=. -L . -lbar -lfoo -o main
$ make
gcc -fPIC -c foo.c
foo.c:1:0: warning: -fPIC ignored for target (all code is position independent) [enabled by default]
gcc -fPIC -c bar.c
bar.c:1:0: warning: -fPIC ignored for target (all code is position independent) [enabled by default]
gcc -fPIC -c main.c
main.c:1:0: warning: -fPIC ignored for target (all code is position independent) [enabled by default]
gcc -shared foo.o -o libfoo.dll
gcc -shared bar.o foo.o -o libbar.dll
gcc main.o -Wl,-rpath=. -L . -lbar -lfoo -o main
$ ./main
Hello World!
Hello World!
हालांकि, मैं इस दृष्टिकोण पसंद नहीं है के बाद से libbar.dll अब प्रतीक शामिल होते हैं दोनों फू और बार के लिए। लिनक्स में, इसमें केवल बार के लिए प्रतीक होते हैं। यह अलगाव उन स्थितियों के लिए महत्वपूर्ण है जहां पुस्तकालय कुछ मानक संख्यात्मक पुस्तकालय जैसे बीएलएएस पर निर्भर करता है। मैं साझा लाइब्रेरी को तैनात करने में सक्षम होना चाहता हूं और यह उपयोगकर्ता की मशीन पर संख्यात्मक लाइब्रेरी के अनुकूलित संस्करण पर निर्भर करता है, न कि स्वयं का।
किसी भी मामले में, साझा लाइब्रेरी बनाने के लिए उचित प्रक्रिया क्या है जहां सभी प्रतीकों संकलन समय पर मौजूद नहीं हैं?
यदि यह महत्वपूर्ण है, तो मैंने इन उदाहरणों को लिनक्स पर जीसीसी 4.6.3 और विंडोज़ पर जीसीसी 4.7.2 के साथ mingw-get-inst-20120426.exe के साथ संकलित किया।
आप 'f__.h' और 'bar.h' दोनों में आवश्यक' __declspec (dllimport) 'और' __declspec (dllexport) 'खो रहे हैं। की तरह कुछ: '#if __ELF__ #define एपीआई __attribute ((दृश्यता (" डिफ़ॉल्ट "))) परिभाषित परिभाषित निर्यात #define एपीआई __declspec (dllexport) #else #define एपीआई __declspec (dllimport) #endif #elif ' फिर' foo.c' और 'bar.c' में '# परिभाषित करें'। – bit2shift
कुछ ऐसा [https://]] (https://github.com/bit2shift/r3dVoxel/blob/master/inc/r3dVoxel/r3vABI.hpp#L7-L13) लेकिन बिना 'बाहरी "सी" 'के बिना, जो एक सी ++ निर्माण है। – bit2shift