MSVC

2015-06-09 7 views
5

मैं जंग पुस्तकालय के खिलाफ खिड़कियों पर एक साधारण सी lib साथ लिंक करने के लिए कोशिश कर रहा हूँ के साथ संकलित एक स्थिर lib से लिंक करनाMSVC

मेरे lib ज है

extern "C" { 
    void say_hello(const char* s); 
} 

सीपीपी

#include <stdio.h> 

void say_hello(const char* s) { 
    printf("hello world"); 
} 

मेरे जंग फ़ाइल

#[link(name="CDbax", kind="static")] 
extern "C" { 
    fn say_hello(s: *const libc::c_char) ->() ; 
} 

Linki एनजी डेटा प्रतीकों

error: linking with `gcc` failed: exit code: 1 
note: "gcc" "-Wl,--enable-long-section-names" "-fno-use-linker-plugin" "-Wl,--nxcompat" "-Wl,--large-address-aware" "-shared-libgcc" "-L" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib" "e:\Rust\DBTools\DBAnalytics\target\debug\DBAnalytics.o" "-o" "e:\Rust\DBTools\DBAnalytics\target\debug\DBAnalytics.dll" "e:\Rust\DBTools\DBAnalytics\target\debug\DBAnalytics.metadata.o" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib\libstd-11582ce5.rlib" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib\libcollections-11582ce5.rlib" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib\librustc_unicode-11582ce5.rlib" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib\librand-11582ce5.rlib" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib\liballoc-11582ce5.rlib" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib\liblibc-11582ce5.rlib" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib\libcore-11582ce5.rlib" "-L" "e:\Rust\DBTools\DBAnalytics\target\debug" "-L" "e:\Rust\DBTools\DBAnalytics\target\debug\deps" "-L" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib" "-L" "e:\Rust\DBTools\DBAnalytics\.rust\bin\i686-pc-windows-gnu" "-L" "e:\Rust\DBTools\DBAnalytics\bin\i686-pc-windows-gnu" "-Wl,-Bstatic" "-Wl,--whole-archive" "-l" "CDbax" "-Wl,--no-whole-archive" "-Wl,-Bdynamic" "-l" "ws2_32" "-l" "userenv" "-l" "advapi32" "-shared" "-l" "compiler-rt" 
note: Warning: corrupt .drectve at end of def file 
Cannot export [email protected][email protected]@[email protected]: symbol not found 

पुस्तकालय एक साधारण स्थिर lib के रूप में MSVC2013 पर निर्माण है में से एक के साथ एक त्रुटि देकर विफल रहता है। स्ट्रिंग "हैलो वर्ल्ड" डेटा सेक्शन में है, इसलिए मैं इसकी लिंक लिंक का कारण बनने की अपेक्षा नहीं करता। क्या विंडोज़ पर सी पुस्तकालयों को जोड़ने के बारे में मुझे कुछ विशिष्ट सेटिंग्स की जानकारी है?

बीटीडब्ल्यू यह 32 बिट एमएसवीसी lib है।

+0

यदि आप जीसीसी के साथ डीएलएल बनाने की कोशिश करते हैं तो क्या होगा? –

+0

जंग को कुछ दिन पहले एमएसवीसी समर्थन मिला, लेकिन मुझे नहीं लगता कि कोई एमएसवीसी-नाइटलीज है, और मुझे नहीं पता कि यह समर्थन कितना दूर है। आप '-/target' को कॉल करके अपने स्वयं के mvsc-rustc को '- targetarget x86_64-pc-windows-msvc' के साथ कॉल करने का प्रयास कर सकते हैं, हमें बताएं कि यह कैसा चल रहा है! संबंधित पीआर: https://github.com/rust-lang/rust/pull/25848 –

उत्तर

9

ठीक है, कुछ चीजें। सबसे पहले, "स्थिर डीएलएल" जैसी कोई चीज़ नहीं है: एक डीएलएल गतिशील रूप से लिंक लाइब्रेरी है।

दूसरा, जंग MingW टूलचेन और रनटाइम का उपयोग करता है। एमएसवीसी और मिनजीडब्ल्यू रनटाइम्स को मिलाकर अजीब चीजें हो सकती हैं, इसलिए यदि संभव हो तो शायद यह सबसे अच्छा बचा है। जंग ने हाल ही में एमएसवीसी रनटाइम का उपयोग करके निर्माण के लिए बहुत जल्दी समर्थन दिया है।

हालांकि, अगर आप काम करने के लिए इस विशिष्ट उदाहरण, जाहिरा तौर पर किसी भी बीमार प्रभाव के बिना प्राप्त कर सकते हैं। आपको बस कुछ चीजों को बदलने की जरूरत है:

  • आपको गतिशील लाइब्रेरी का उपयोग करने की आवश्यकता है; मेरी समझ यह है कि इससे खराब बातचीत कम हो जाती है।

  • आप करने की जरूरत है वास्तव मेंC लिंकेज, नहीं C++ लिंकेज के साथ say_hello संकलन। आपने इसे हेडर में किया है, लेकिन स्रोत फ़ाइल में नहीं।

  • आपको पुस्तकालय से सार्वजनिक रूप से say_hello निर्यात करने की आवश्यकता है।

इस प्रकार

:

hello.rs:

#[link(name="hello", kind="dylib")] 
extern { 
    fn say_hello(); 
} 

fn main() { 
    unsafe { say_hello(); } 
} 

hello.h:

#ifndef HELLO_H 
#define HELLO_H 

extern "C" { 
    __declspec(dllexport) void say_hello(); 
} 

#endif 

hello.cpp:

#include <cstdio> 

#include "hello.h" 

void say_hello() { 
    printf("hello world\n"); 
} 

build.cmd

cl /LD hello.cpp 
rustc -L. hello.rs 

मेरी मशीन पर, यह hello.exe और hello.dll पैदा करता है; जब दौड़ें, hello.exehello world प्रिंट करता है।

+0

मेरा मतलब स्थिर lib, डीएल नहीं था। अफसोस की बात है कि हमारे 'कॉर्पोरेट' पुस्तकालय सभी एमएसवीसी का उपयोग करके लिखे गए हैं, इसलिए यह वास्तव में मेरे लिए उन्हें बदलने का विकल्प नहीं है। मैं ऊपर दिए गए – Ronnie

+2

@ रोनी को दूंगा, अगर आप स्थिर lib और डीएलएल नहीं चाहते हैं, तो आपको इसे प्रतिबिंबित करने के लिए शायद अपना प्रश्न अपडेट करना चाहिए। वर्तमान में यह कई बार बताता है कि यह एक डीएलएल है। –

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