2017-03-24 10 views
1

g ++に変更すると、次のエラーが発生します。私はシンプルなシンプルなC++コードでテストしましたが、コマンドは正常に動作します。そのPNGクラスファイルの問題ですか?しかし、同じファイルが私のMacOSで以前は動作しましたが、突然今日は失敗しました。clang ++リンカアーキテクチャx86_64の未定義シンボル

Undefined symbols for architecture x86_64: 
"PNG::writeToFile(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from: 
    _main in main-f6a06a.o 
"PNG::PNG(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from: 
    _main in main-f6a06a.o 
"PNG::PNG(unsigned long, unsigned long)", referenced from: 
    _main in main-f6a06a.o 
"PNG::~PNG()", referenced from: 
    _main in main-f6a06a.o 
"PNG::operator()(unsigned long, unsigned long)", referenced from: 
    _main in main-f6a06a.o 
"PNG::width() const", referenced from: 
    _main in main-f6a06a.o 
"PNG::height() const", referenced from: 
    _main in main-f6a06a.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
+1

私は、他のオブジェクトやライブラリがリンクされているか、他のファイルがそのコマンドラインでコンパイルされて表示されません。 PNGはどこに実装されていますか? – user4581301

答えて

0

上記の方法でリンカエラーを解決するには、リンカに静的/共有を提供していますか?また、clang ++はg ++とは異なるコンパイラであるため、使用するのと同じコンパイラ(clang ++)で先にコンパイルされた静的/共有ライブラリが必要です。

+0

Macでは、g ++は非常に長い間clangされています - 少なくとも5年間。しかし、はい、ライブラリをコマンドラインに追加する必要があります。 –

0

試してください:あなたは(libpngの最も可能性が高い)あなたのPNGライブラリの実装を含むライブラリを提供していない。なぜ

clang++ main.cpp -o out -lpng 

がここにあります。コンパイラに-lpngが追加されているため、関連するライブラリとリンクします。特定のケースでは正確に-lpngではないかもしれませんが、確かに "missing library"です。どのライブラリを使用しようとしているのかを正確に把握していないと(「修正を試す」ためにソースを提供していない)

コメントに指摘されているように、上にC++ラッパーを使用していますが、上のコードでは十分ではありません。実際に使用しているpng機能のC++ラッパーを正確に把握していないと、コマンドラインは次のようになります。

おそらくthis

+0

IIRC libpngはCライブラリです。欠けているように見えるのは、C++ラッパーです。 –

+0

はい、おそらく。説明するためにもう少しテキストを追加します。 –

関連する問題