0

そのため、私はしばらくの間、C ++とObjective-Cで構成される簡単なアプリケーションをハッシュ化して接続し、いくつかの概念を証明して何かを学ぼうと取り組んできました。

これが私が今いるところです、私のコマンド(実行されており、変更時に再実行されます)は

$ autoreconf -vis && make clean && ./configure && make && ./src/greetings

完了したら実行されることを期待していることに注意してください。簡単なファイルリストを次に示します。

$検索。| ack'\。(?: cpp | mm | h)$'
./src/darwin/greet.cpp
./src/darwin/greeting.h
./src/darwin/greeting.mm
./src/greet.h
./src/main.cpp
./src/mingw32/greet.cpp
./src/mingw32/greet.h

完全なファイルはすべて、GithubのこのGistにあります。

特に言語の混合に問題があるのではなく(私はそれほど遠くまでは行きません)-これがObjective-C(またはObjecC++)であることを認識していないコンパイラにつまずくようです-そのため、私のautoconfファイルはこの要点にあります。

完全なエラー出力がここにあります。これも要点です。

サンプルは次のとおりです。

/usr/include/c++/4.2.1/iosfwd:48からインクルードされたファイルでは、
                 /usr/include/c++/4.2.1/ios:43から、
                 /usr/include/c++/4.2.1/ostream:45から、
                 /usr/include/c++/4.2.1/iostream:45から、
                 darwin / greet.cpp:10から:
/usr/include/c++/4.2.1/bits/stringfwd.h:48:エラー:Cリンケージのテンプレート
/usr/include/c++/4.2.1/bits/stringfwd.h:51:エラー:Cリンケージのテンプレート
/usr/include/c++/4.2.1/bits/stringfwd.h:54:エラー:Cリンケージのテンプレート
/usr/include/c++/4.2.1/bits/stringfwd.h:58:エラー:Cリンケージによるテンプレートの特殊化
/usr/include/c++/4.2.1/bits/stringfwd.h:63:エラー:Cリンケージによるテンプレートの特殊化
/usr/include/c++/4.2.1/iosfwd:49からインクルードされたファイルでは、
                 /usr/include/c++/4.2.1/ios:43から、
                 /usr/include/c++/4.2.1/ostream:45から、
                 /usr/include/c++/4.2.1/iostream:45から、
                 darwin / greet.cpp:10から:
4

2 に答える 2

0

「Cリンケージのあるテンプレート」の問題は、ブロックの#include <iostream>内側が原因です。extern "C"次のようなものを試してください。

#include <CoreFoundation/CoreFoundation.h>
#include <iostream>

/* In a #ifdef __cplusplus block, if you want. */
extern "C"
void greet() {
  /* ... */
}

これによりgreet()、ヘッダーが誤って解釈されることなく、Cリンケージが作成されます。

于 2010-09-22T06:14:45.950 に答える
0

zipファイルをいじってみることから、これが私がお勧めするものです:

言語境界でCのみのインターフェースを使用します。これにより、automakeの存在しないObjective-C++サポートが回避されます。使用

#ifdef __cplusplus
extern "C"
#endif

ヘッダーをだまして、C ++コンパイラがC関数を生成し、Objective-Cコンパイラがヘッダーを処理できるようにします。これにより、Objective-Cコードがインターフェイスを呼び出すことができるようになります。

以前と同じようにソースツリーを設定します:の一般的なコードsrc/、のOS固有のコードsrc/darwinsrc/msdos(:P)などsrc/win32。にすべてのソースを一覧表示しEXTRA_foo_SOURCESますMakefile.am

configure.ac、コンパイルするプラットフォームをテストし、読み取ることができるAM_CONDITIONALフラグを設定するために使用しMakefile.amます(これはすでに正しく実行されています)。

Makefile.am、条件を使用して、正しい追加のソースを含めます。

if OS_DARWIN
  foo_SOURCES += darwin/foo.m darwin/bar.h darwin/baz.m
  foo_LDFLAGS = -Wl,-framework,Foundation
endif

リンカの選択方法が原因で、C++リンクが試行されることに注意してください。Objective-Cコードリンクを作成するための追加のリンカフラグは、にある必要がありますfoo_LDFLAGS

あなたのケースで起こったことは次のとおりです。で、あなたはとしてgreet.h宣言しませんでした。これは、コンパイルされたときに、C ++リンケージを持つものを期待していたことを意味します(私の場合、シンボルはでした)。コンパイルされ、として宣言されていたため、Cバージョン(記号付き)が生成されました。リンカがシンボルを予期したが、何も提供しなかったため、リンクは失敗しました。void greet();extern "C"main.cppvoid greet()greetdarwin/greet.cppvoid greet()extern "C"_greetgreet

于 2010-09-26T04:58:06.280 に答える