その3の続き

その3ではリンクを Visual C++ 側で行いましたが、GCC 側でも行ってみます。

C:\cygwin\home\umezawa>cl /Focallee_vc.o /c callee.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

callee.c
umezawa@selene ~$ gcc -o a3 main.c callee_vc.o
Warning: corrupt .drectve at end of def file

何やらエラーが出てリンクできません。

このエラーをググると、どうやらデフォルトの(ランタイム)ライブラリを指示する機能を GCC 側のリンカが解釈できないことにより発生するものであるらしいことが分かります。Visual C++ だけの世界であっても、デバッグビルドのオブジェクトファイルとリリースビルドのオブジェクトファイルを混ぜてリンクしようとすると警告が出ますが、それはこの機能によるものです。

デフォルトのライブラリの指示を省略するオプション /Zl があるので、それを指定してみましょう。

c:\cygwin\home\umezawa>cl /Focallee_vc_2.o /Zl /c callee.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

callee.c
umezawa@selene ~$ gcc -o a3 main.c callee_vc_2.o

umezawa@selene ~$ ./a3
10
14

正しく動きました。

前回と同様にスタティックライブラリも作ってみます。

C:\cygwin\home\umezawa>cl /Focallee2_a_vc.o /Zl /c callee2_a.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

callee2_a.c

C:\cygwin\home\umezawa>cl /Focallee2_b_vc.o /Zl /c callee2_b.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

callee2_b.c

C:\cygwin\home\umezawa>cl /Focallee2_c_vc.o /Zl /c callee2_c.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

callee2_c.c

c:\cygwin\home\umezawa>lib /OUT:callee2_vc.a callee2_a_vc.o callee2_b_vc.o callee2_c_vc.o
Microsoft (R) Library Manager Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.

umezawa@selene ~$ gcc -o a4 main2.c callee2_vc.a

umezawa@selene ~$ ./a4
20
13
6

Visual C++ の方で /Zl オプションを指定すれば、後は特に問題なくリンクできるようです。

もっとも、GCC 主体のプロジェクトに Visual C++ でコンパイルしなければいけないソースを追加することもないと思いますが。(みもふたもない)

その5に続く。

Trackback

only 1 comment untill now

  1. Windows 上での Visual C++ と GCC/Clang の相互運用(その5)

    その4の続き C++ だとどうでしょうか。 umezawa@selene ~$ cat callee_cpp.cc int func_cpp(int x, int y, int z) { return x * y + z; } umezawa@selene ~$ cat main_cpp.cpp #include <stdio.h> int func_cpp(int x, int y, int z); int main(vo…

Add your comment now