C++でCのファイルをリンクする
1991 ワード
テキストリンク:http://xcoder.in/2014/12/10/link-c-on-gpp/
の原因となる
いくつかの理由で、私はとてもこすったメモリプール(Cバージョン)を書きました.
そして、前に書いたNode.jsパッケージthmclrxのもっと挫折した「偽・メモリプール」を、新しく書いたメモリプールで置き換えることを考えました.(❛◡❛✿)
それから問題が来て、私はnode-gypを制御してG++で
つまり、私がリンクをコンパイルした
仮想シナリオ
仮想一
最初は「node-gypでコンパイラを手動で選択する方法」を探していました.つまり、
仮想2
それから私は考えて、そこでコンパイルする時に私がCと話しているのか、それともC++と話しているのかを識別することにしました.(ノ◕ヮ◕)ノ*:・゚✧
ソリューション
そこで私はこのような投稿を見つけました.http://grokbase.com/t/gg/nodejs/14amregx72/linking-c-sources-files-in-cc-files
彼も私に似たような問題に遭遇したようだ.次の質問者は自分でこのような答えを出しました.
Nevermind, found my own answer after finally hitting the right google search terms.
Added
So that the CPP compiler would know I was talking C and not CPP :)
答えの大意はあなたのCヘッダファイルにblahblahの大きなマクロを追加して、C++のコンパイラにC++ではなくCの中間ファイルと交流していることを知らせて、このようにリンクする時正常に軌道に乗ることができます.そこで私は私の新版xmempoolのヘッダファイルにこの2つの話を追加しました.
事後たばこ
実は以前私もいつも別のプロジェクトの中でこの
今日このようなことを通じてやっとその用途を知りました.新しいスキルget√.
ε(*´・∀・`)з゙
の原因となる
いくつかの理由で、私はとてもこすったメモリプール(Cバージョン)を書きました.
そして、前に書いたNode.jsパッケージthmclrxのもっと挫折した「偽・メモリプール」を、新しく書いたメモリプールで置き換えることを考えました.(❛◡❛✿)
それから問題が来て、私はnode-gypを制御してG++で
*.c
ファイルをコンパイルすることができないようで、このようにするとすべてのファイルがコンパイルされた後に*.o
ファイルをリンクして問題が発生します.リンクしている時は間違っていませんでしたが、使っている時はこんな間違いを報告していました(;´༎ຶД༎ຶ`): ➜ thmclrx git:(master) ✗ node test/test.js
dyld: lazy symbol binding failed: Symbol not found: __Z16xmem_create_poolj
Referenced from: /Users/.../code/huaban/thmclrx/build/Release/thmclrx.node
Expected in: dynamic lookup
dyld: Symbol not found: __Z16xmem_create_poolj
Referenced from: /Users/.../code/huaban/thmclrx/build/Release/thmclrx.node
Expected in: dynamic lookup
[1] 52501 trace trap node test/test.js
つまり、私がリンクをコンパイルした
thmclrx.node
には__Z16xmem_create_poolj
という記号が見つかりません.つまり、xmempool.o
というCでコンパイルされたファイルは正しくリンクされていません.仮想シナリオ
仮想一
最初は「node-gypでコンパイラを手動で選択する方法」を探していました.つまり、
*.c
ファイルを自動的にGCCを選択してコンパイルしないようにしました.その後果がなかった.ル||☛_☚|リ 仮想2
それから私は考えて、そこでコンパイルする時に私がCと話しているのか、それともC++と話しているのかを識別することにしました.(ノ◕ヮ◕)ノ*:・゚✧
ソリューション
そこで私はこのような投稿を見つけました.http://grokbase.com/t/gg/nodejs/14amregx72/linking-c-sources-files-in-cc-files
彼も私に似たような問題に遭遇したようだ.次の質問者は自分でこのような答えを出しました.
Nevermind, found my own answer after finally hitting the right google search terms.
Added
#ifdef __cplusplus
extern "C" {
#endif
//... source code here...
#ifdef __cplusplus
}
#endif
So that the CPP compiler would know I was talking C and not CPP :)
答えの大意はあなたのCヘッダファイルにblahblahの大きなマクロを追加して、C++のコンパイラにC++ではなくCの中間ファイルと交流していることを知らせて、このようにリンクする時正常に軌道に乗ることができます.そこで私は私の新版xmempoolのヘッダファイルにこの2つの話を追加しました.
事後たばこ
実は以前私もいつも別のプロジェクトの中でこの
#ifdef __cplusplus
のマクロ定義を見ていましたが、以前はどういう意味か分かりませんでした.今日このようなことを通じてやっとその用途を知りました.新しいスキルget√.
ε(*´・∀・`)з゙