私は最終的にオープンソースになるCスタティックライブラリを開発中ですので、WindowsとUbuntuでクロスコンパイルして移植性の問題を回避します。NetBeansを使用しているLinuxスタティックライブラリのシンボルがありません
私が抱えている問題は、オブジェクトファイルの1つのシンボルがLinuxビルドから省略されていることです。 Windows上でVS2015を使用してライブラリを構築すると、すべてのシンボルが表示されます。
私はほとんどWindows用の開発に慣れていますので、ほとんどのビルドシナリオではIDEを使用することに甘んじています。 UbuntuではNetBeansを使用していますが、問題がgccを理解しているかどうか、またはNetBeansが正しく設定されていないかどうかはわかりません。
詳細
Ubuntuの16.04LTS使用GCC(Ubuntuの)5.4.0
のNetBeans IDE 8.1のC/C++
ライブラリは3つのソースファイルと2つのヘッダファイルで構成されています
queue.c --> queue implementation
memutil.c --> memory utilities
mylib.c --> main library implementation
queue.h --> included by queue.c and mylib.c
mylib.h --> header file for the static library
mylib.h
ヘッダーには、のヘッダー情報が含まれています3210ソースファイル。コマンドラインのMEMCHECK
シンボルに依存する条件でラップされています。ソースファイルのmemutil.c
のコードと同様です。 MEMCHECK
シンボルはライブラリをビルドするときに定義されますが、Linuxビルド後にlibmylib.a
にnm
を実行すると、memutil.o
オブジェクトファイルのシンボルは表示されません。 Windowsでmylib.lib
ファイルを見ると、memutil.obj
のすべてのシンボルが表示されます。
mylib.h
ヘッダーだけを含むスタブアウトソースファイルを追加すると、すべてのシンボルがlibmylib.a
ライブラリに存在します。私はヘッダファイルの相互作用の機能不全のいくつかの並べ替えがあると推測しているが、私はそれが何であるか、またはそれを修正する方法を見つけるために見ていない。私は、私が考えることができるように多くの異なる言葉遣いでGoogleからこれを鼻をついたが、喜びはない。ヘッダファイルのインクルードにスタブ
gcc -c -g -Wall -DMEMCHECK -MMD -MP -MF "build/queue.o.d" -o build/queue.o queue.c
gcc -c -g -Wall -DMEMCHECK -MMD -MP -MF "build/memutil.o.d" -o build/memutil.o memutil.c
gcc -c -g -Wall -DMEMCHECK -MMD -MP -MF "build/mylib.o.d" -o build/mylib.o mylib.c
ar -rv dist/Debug/GNU-Linux/libmylib.a build/queue.o build/memutil.o build/mylib.o
ar: creating dist/Debug/GNU-Linux/libmylib.a
a - build/queue.o
a - build/memutil.o
a - build/mylib.o
ranlib dist/Debug/GNU-Linux/libmylib.a
BUILD SUCCESSFUL (total time: 3s)
このために修正することはできません、それは次のことができます。ここでは
は、NetBeansは、出力を構築するディレクトリノイズのすべての少ないですか?それは動作しますが、それは非常に原油のようです。さらに、gccで必要でありVS2015では必要ではないとは本当に信じられません。
少し毛深いことがありますが、 '-E'オプションでコンパイルすることを検討することもできます。これは、プリプロセッサが実行された後のソースコードを表示するので、 '-DMEMCHECK'があなたがしなければならないと思っていることをしているかどうかを知ることができるはずです。あなたのコードは、 '#include'の後ろに終わりに向かっています。出力をファイルにリダイレクトすることもできます。 'gcc -E code.c> ppCode.c' https://stackoverflow.com/questions/3742822/preprocessor-output – yano
は' -Wextra'フラグを付けてコンパイルすることをお勧めしますより多くの警告。 – yano
@yano:条件付きで問題が発生した場合、Windowsビルドもうまくいくと思います。 –