2011-07-21 46 views

Trả lời

7

Nó không tương thích. Tuy nhiên, nếu bạn trích xuất tất cả các tệp đối tượng từ thư viện (sử dụng ar), trình liên kết VC++ có thể xử lý chúng (tôi đã thử nghiệm, mặc dù tôi đã sử dụng gg Cygwin chứ không phải là mcc). Lưu ý rằng bạn vẫn có thể gặp vấn đề về mangling nếu bạn không sử dụng extern "C".

Bạn có thể sử dụng công cụ LIB.EXE của VC++ để biến chúng thành thư viện tĩnh theo định dạng VC++.


Khi @Michael chỉ ra, bạn chắc chắn sẽ gặp sự cố nếu cố truyền các đối tượng không phải POD C++ giữa các mô-đun được xây dựng với các trình biên dịch khác nhau. Việc sửa lỗi này giống với trường hợp DLL: viết một trình bao bọc được xây dựng với cùng trình biên dịch (trong trường hợp này là mingw) để lộ ra một giao diện tương thích với C có thể sử dụng được từ các công cụ khác.


// minimal.cpp 
extern "C" int m(void) { return 7; } 

$ gcc -v 
Using built-in specs. 
COLLECT_GCC=gcc 
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-pc-cygwin/4.5.0/lto-wrapper.exe 
Target: i686-pc-cygwin 
Configured with: /gnu/gcc/releases/respins/4.5.0-1/gcc4-4.5.0-1/src/gcc-4.5.0/co 
nfigure --srcdir=/gnu/gcc/releases/respins/4.5.0-1/gcc4-4.5.0-1/src/gcc-4.5.0 -- 
prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdi 
r=/usr/lib --datadir=/usr/share --localstatedir=/var --sysconfdir=/etc --dataroo 
tdir=/usr/share --docdir=/usr/share/doc/gcc4 --datadir=/usr/share --infodir=/usr 
/share/info --mandir=/usr/share/man -v --with-gmp=/usr --with-mpfr=/usr --enable 
-bootstrap --enable-version-specific-runtime-libs --libexecdir=/usr/lib --enable 
-static --enable-shared --enable-shared-libgcc --disable-__cxa_atexit --with-gnu 
-ld --with-gnu-as --with-dwarf2 --disable-sjlj-exceptions --enable-languages=ada 
,c,c++,fortran,java,lto,objc,obj-c++ --enable-graphite --enable-lto --enable-jav 
a-awt=gtk --disable-symvers --enable-libjava --program-suffix=-4 --enable-libgom 
p --enable-libssp --enable-libada --enable-threads=posix --with-arch=i686 --with 
-tune=generic --enable-libgcj-sublibs CC=gcc-4 CXX=g++-4 CC_FOR_TARGET=gcc-4 CXX 
_FOR_TARGET=g++-4 GNATMAKE_FOR_TARGET=gnatmake GNATBIND_FOR_TARGET=gnatbind --wi 
th-ecj-jar=/usr/share/java/ecj.jar 
Thread model: posix 
gcc version 4.5.0 (GCC) 

$ gcc -c minimal.cpp 

// minmain.cpp 
extern "C" int m(void); 

#include <iostream> 

int main(void) { std::cout << m() << "\n"; } 

R:\>cl /c /EHsc minmain.cpp 
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86 
Copyright (C) Microsoft Corporation. All rights reserved. 

minmain.cpp 

R:\>link minmain.obj minimal.o 
Microsoft (R) Incremental Linker Version 10.00.40219.01 
Copyright (C) Microsoft Corporation. All rights reserved. 


R:\>minmain 
7 
+0

Các tập tin đối tượng sẽ không tương thích một trong hai. –

+1

@Michael: Họ là, tôi vừa thử nghiệm nó. –

+0

Tuyệt. Cảm ơn bạn. Câu trả lời tuyệt vời. – Cartesius00

Các vấn đề liên quan