Làm cách nào để liên kết ứng dụng bảng điều khiển Visual C++ (2010) với thư viện STATIC được tạo bởi MinGW
(định dạng *.a
)? Có tương thích với Visual C++ 2010 không?Liên kết Visual C againts Thư viện tĩnh của MinGW
Cảm ơn bạn.
Làm cách nào để liên kết ứng dụng bảng điều khiển Visual C++ (2010) với thư viện STATIC được tạo bởi MinGW
(định dạng *.a
)? Có tương thích với Visual C++ 2010 không?Liên kết Visual C againts Thư viện tĩnh của MinGW
Cảm ơn bạn.
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
Các tập tin đối tượng sẽ không tương thích một trong hai. –
@Michael: Họ là, tôi vừa thử nghiệm nó. –
Tuyệt. Cảm ơn bạn. Câu trả lời tuyệt vời. – Cartesius00