2016-11-22 14 views
0

最近、私はC++で新しいプロジェクトを開始しました。問題は、コンパイルしようとするとリンクエラーが発生することです。今日は、デバッグしようと一日を費やしましたが、どこでも良い解決策を見つけることはできませんでした。誰かがそれを手伝うことができたらそれはすばらしいことになるでしょう。私はMac Sierraを使用しています。x86_64 - Cmake - Mac sierra

parsing/methylation.h

#ifndef EPIRL_METHYLATION_H 
#define EPIRL_METHYLATION_H 

#include <stdio.h> 
#include <iostream> 
#include <fstream> 
#include <vector> 
#include <sstream> 

using namespace std; 

namespace methylation { 
    struct MethLine { 
     string chr; 
     int coord; 
     char strand; 
     int methylated; 
     int un_methylated; 
     string context; 
     string tag; 
    }; 

    string calculateMethylationByContext(
      MethLine m_input[], int length, 
      int window_start, int window_end, int threshold); 

    void calculateMethylation(
     const istream &methylation_stream, 
     const istream &coordinate_stream, 
     const ostream &output_stream 
    ); 
} 

#endif //EPIRL_METHYLATION_H 

parsing/methylation.cpp

#include "methylation.h" 

namespace methylation { 
    string calculateMethylationByContext(
      MethLine m_input[], int length, 
      int window_start, int window_end, int threshold) { 
// rest of the code ... 
    } 
} 

main.cpp

#include <iostream> 
#include <fstream> 
#include "parsing/methylation.h" 

using namespace std; 

int main(int argc, char **argv) { 
    if (argc != 4) { 
     cout << "Invalid number of arguments..." << endl; 
     return 1; 
    } 

    char *methylation_file = argv[1]; 
    char *coordinate_file = argv[2]; 
    char *output_file = argv[3]; 

    ifstream methylation_file_stream(methylation_file, ios::binary); 
    ifstream coordinate_file_stream(coordinate_file, ios::binary); 
    ofstream output_file_stream(output_file, ios::binary); 

    methylation::calculateMethylation(methylation_file_stream, 
         coordinate_file_stream, output_file_stream); 
    methylation_file_stream.close(); 
    coordinate_file_stream.close(); 
    output_file_stream.close(); 

    return 0; 
} 

私は自分のコーディングにCLionを使用しています。私はそれを構築しようとすると、私のcmakeのコマンドが正常に動作しますが、私は、私は次のエラーを取得する「作る」をクリックするとき:

Undefined symbols for architecture x86_64: 
    "methylation::calculateMethylation(std::__1::basic_istream<char, std::__1::char_traits<char> > const&, std::__1::basic_istream<char, std::__1::char_traits<char> > const&, std::__1::basic_ostream<char, std::__1::char_traits<char> > const&)", referenced from: 
     _main in main.cpp.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make[3]: *** [src] Error 1 
make[2]: *** [CMakeFiles/src.dir/all] Error 2 
make[1]: *** [CMakeFiles/src.dir/rule] Error 2 
make: *** [src] Error 2 

CMakeLists.txtファイルには、次のようになります。

cmake_minimum_required(VERSION 3.6) 
project(src) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

set(SOURCE_FILES 
    parsing/methylation.cpp 
    parsing/methylation.h 
    main.cpp) 

add_executable(src ${SOURCE_FILES}) 

私はcmakeのコマンドを実行すると、私の出力はこれです:

-- The C compiler identification is AppleClang 8.0.0.8000042 
-- The CXX compiler identification is AppleClang 8.0.0.8000042 
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc 
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc -- works 
-- Detecting C compiler ABI info 
-- Detecting C compiler ABI info - done 
-- Detecting C compile features 
-- Detecting C compile features - done 
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ 
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ -- works 
-- Detecting CXX compiler ABI info 
-- Detecting CXX compiler ABI info - done 
-- Detecting CXX compile features 
-- Detecting CXX compile features - done 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /Users/sztankatt/Documents/University/PartIII/Project/epiRL/src 
+0

シンボルのすべてのソースファイルを検索します。次に、シンボルを含むソースファイルがコンパイルされ*リンクされていることを確認します。また、シンボルがスタティックでもプライベートでもないことを確認してください。 –

+0

あなたが提供するコードの 'calculateMethylation'の**定義**が表示されません。 'parsing/methylation.h'にこの関数の*宣言*しかありません。 – Tsyvarev

+0

'calculateMethylationByContext'に関連するものを表示していますが、エラーは' calculateMethylation'に関連しています。この関数をどこで定義しましたか? – nos

答えて

0

コンパイラが自動的にCMAKEによって検出されたダブルチェック。 最初にCMAKEを実行したときにCMAKEから通知される内容を投稿できますか?

This may be a hint for your problem, too

+0

ねえ!ちょうど私のcmakeコマンドの出力を投稿しました。 興味深いことに、methylation.cppファイルの内容をmain.cppにコピーすると、コードはエラーなしでコンパイルされます。リンクが適切に機能しないようです。 – tomooka

+0

ことができますあなたは以下しようとすると何が起こるかを確認してください。 cmakeの-DCMAKE_C_COMPILER =は/ usr/binに/ gccの-DCMAKE_CXX_COMPILER =は/ usr/binに/ G ++ –

+0

全く同じエラー:( – tomooka

0

あなたCMakeLists.txtは大丈夫です。

@ thomas-matthews @tsyvarev @nosがコメントで指摘したように、サンプルコードにはmethylation::calculateMethylation()の定義/実装がありません。あなたが見ているのは、この状況でApple/clangの予想される失敗です。

❯ make 
[ 33%] Building CXX object CMakeFiles/src.dir/parsing/methylation.cpp.o 
/Users/nega/foo/parsing/methylation.cpp:8:5: warning: control reaches end of non-void function [-Wreturn-type] 
    } 
    ^
1 warning generated. 
[ 66%] Building CXX object CMakeFiles/src.dir/main.cpp.o 
[100%] Linking CXX executable src 
Undefined symbols for architecture x86_64: 
    "methylation::calculateMethylation(std::__1::basic_istream<char, std::__1::char_traits<char> > const&, std::__1::basic_istream<char, std::__1::char_traits<char> > const&, std::__1::basic_ostream<char, std::__1::char_traits<char> > const&)", referenced from: 
     _main in main.cpp.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make[2]: *** [src] Error 1 
make[1]: *** [CMakeFiles/src.dir/all] Error 2 
make: *** [all] Error 2 

ダミー実装を追加したり、あなたmain.cppで呼び出しをコメントアウト、makeが正常に完了することができます。

あなたは正しい実装を持っていると仮定すると

は、あなたが(多分別のファイルに)あなたのコード内でmethylation::calculateMethylation()の実装を持っていると仮定しましょう。 CMakeで生成されたMakefileのビルドエラーをデバッグするには、make変数VERBOSEをtrue値、つまりmake VERBOSE=1に設定して実行する必要があります。

❯ make VERBOSE=1 
/usr/local/Cellar/cmake/3.7.0/bin/cmake -H/Users/nega/foo -B/Users/nega/foo/build --check-build-system CMakeFiles/Makefile.cmake 0 
/usr/local/Cellar/cmake/3.7.0/bin/cmake -E cmake_progress_start /Users/nega/foo/build/CMakeFiles /Users/nega/foo/build/CMakeFiles/progress.marks 
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/Makefile2 all 
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/depend 
cd /Users/nega/foo/build && /usr/local/Cellar/cmake/3.7.0/bin/cmake -E cmake_depends "Unix Makefiles" /Users/nega/foo /Users/nega/foo /Users/nega/foo/build /Users/nega/foo/build /Users/nega/foo/build/CMakeFiles/src.dir/DependInfo.cmake --color= 
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/src.dir/build.make CMakeFiles/src.dir/build 
[ 33%] Building CXX object CMakeFiles/src.dir/parsing/methylation.cpp.o 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++  -std=gnu++11 -o CMakeFiles/src.dir/parsing/methylation.cpp.o -c /Users/nega/foo/parsing/methylation.cpp 
/Users/nega/foo/parsing/methylation.cpp:8:5: warning: control reaches end of non-void function [-Wreturn-type] 
    } 
    ^
1 warning generated. 
[ 66%] Building CXX object CMakeFiles/src.dir/main.cpp.o 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++  -std=gnu++11 -o CMakeFiles/src.dir/main.cpp.o -c /Users/nega/foo/main.cpp 
[100%] Linking CXX executable src 
/usr/local/Cellar/cmake/3.7.0/bin/cmake -E cmake_link_script CMakeFiles/src.dir/link.txt --verbose=1 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/src.dir/parsing/methylation.cpp.o CMakeFiles/src.dir/main.cpp.o -o src 
Undefined symbols for architecture x86_64: 
    "methylation::calculateMethylation(std::__1::basic_istream<char, std::__1::char_traits<char> > const&, std::__1::basic_istream<char, std::__1::char_traits<char> > const&, std::__1::basic_ostream<char, std::__1::char_traits<char> > const&)", referenced from: 
     _main in main.cpp.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make[2]: *** [src] Error 1 
make[1]: *** [CMakeFiles/src.dir/all] Error 2 
make: *** [all] Error 2 

ここで、リンクステップを見てアイテムが欠落していないかどうかを確認できます。おそらくライブラリ、またはオブジェクトファイルです。もしそうなら、今すぐ元に戻ってCMakeLists.txt

に追加するには、知っている概要

はCMakeので予期しないビルドの失敗をデバッグするための最初のステップは、メイクファイルを実行することで生成された:

❯ make VERBOSE=1 

これが得られますあなたはCMakeが舞台裏でやっていることを洞察します。

関連する問題