8

さらに別のC/C ++統合の質問:私はいくつかのレガシーCライブラリ(それを呼びましょうlibcl.a)をC ++ライブラリ(それを呼びましょう)にある機能で更新しようとしていlibcppl.aます。ライブラリは私のliblc.a環境全体で使用されており、GCC(Cコンパイラモード)を使用して多くのCプロジェクトにリンクされています。

>> gcc prog.c -lcl

現在、オブジェクトファイル(from +で作成)でlibcl.a構成されています。cl.ogcccl.ccl.h

はオブジェクトファイル(from +で作成)でlibcppl.a構成されます。cppl.og++cppl.cppcppl.h

既存のアプリケーションはCで記述されており、ビルドスクリプトはGCCを使用しているため、更新されたライブラリへの移行をできるだけ簡単にしたいと思います。したがって、GCCをメインコンパイラとして使い続けたいのですが、それでも更新されたライブラリとリンクすることができます。

この答えを見つけると、次を使用してC++オブジェクトをGCCCプロジェクトにリンクできます-lstdc++

>> gcc -c cl.c   -o cl.o
>> g++ -c cppl.c -o cppl.o
>> ar rcs libcl.a cl.o cppl.o
>> gcc prog.c -lcl -lstdc++

ただし、コンパイルコマンドラインでの明示的な言及 を削除したいと思います。libstdc++

私がやろうとしたのは、次のようにして、clライブラリにlibstdc++を含めることでした。

>> ar rcs libcl.a cl.o cppl.o /usr/lib/libstdc++.so.6

ただし、アプリケーションをビルドすると、次のようになります。

>> gcc prog.c -lcl
In file included from cppl.cpp:2:
./libcl.a(cppl.o):(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status

1. gccリンカーが、オブジェクトと一緒にアーカイブされたC ++標準ライブラリを見つけられないのはなぜですか?

2. (オブジェクトファイルではなく)ライブラリでの使用に制限はありますか?ar

3.この問題を克服する方法はありますか?

4

1 に答える 1

7

prog.cを使用して個別にコンパイルしてgccから、 を使用g++してリンクできます。

# compile the main program to an object file
gcc  prog.c -o prog.o

#use g++ to link everything (it'll automatically pull in libstdc++)
g++ prog.o -lcl

別の方法として、次のオプションを使用して C ソース ファイルとしてコンパイルするようprog.cに明示的に指示することで、コンパイルとリンクを 1 つのステップで行うことができます。g++prog.c-x

g++ -x c prog.c -lcl

との動作の違いの詳細については、https://stackoverflow.com/a/5854712/12711を参照してください。gccg++

于 2013-01-28T03:21:09.400 に答える