2016-04-27 15 views
0

Ich möchte ein Arbeitsprojekt mit CLion ausführen.
So habe ich versucht, die Makefile durch cmake zu emulieren, aber ich bin nicht sehr gut darin. Ich bin sicher, dass der Fehler innerhalb cmake ist, da das Projekt mit regulären Makefile arbeitet. Leider kann ich nicht viel Information über das Projekt zeigen. Ich hoffe, dass das, was ich zeigen werde, genug wäre, um Ihre Hilfe zu erhalten.CLion - cmake undefined Referenz

Die Struktur Projektverzeichnis (ohne die Dateien angezeigt) ist im folgenden dargestellt:

. 
├── CMakeLists.txt 
├── makefile 
├── include 
│ ├── data 
│ ├── io 
│ ├── learning 
│ ├── metric 
│ ├── scoring 
│ └── io 
└── src 
    ├── data 
    ├── io 
    ├── learning 
    ├── metric 
    ├── scoring 
    ├── utils 
    └── main.cc 

./CMakeLists.txt

cmake_minimum_required(VERSION 3.3) 
project(Project) 
set(DCMAKE_CXX_COMPILER "g++-5") 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 
find_package(Boost 1.57.0 COMPONENTS program_options system filesystem REQUIRED) 
find_package(OpenMP) 
if (OPENMP_FOUND) 
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") 
endif() 
include_directories(${Boost_INCLUDE_DIRS}) 
include_directories("include") 
include_directories("src") 
add_executable(Project src/main.cc) 
target_link_libraries(Project ${Boost_LIBRARIES}) 

Das Projekt ohne Fehler kompiliert, aber nicht während verlinken.
Teil des Fehlers wird im folgenden berichtet:

[ 50%] Linking CXX executable Project 
CMakeFiles/Project.dir/src/main.cc.o: in function "metric::ir::ir_metric_factory(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int)": 
./include/metric/metricfactory.h:47: undefined reference to "metric::ir::Dcg::NAME_[abi:cxx11]" 
./include/metric/metricfactory.h:49: undefined reference to "metric::ir::Ndcg::NAME_[abi:cxx11]" 
./include/metric/metricfactory.h:51: undefined reference to "metric::ir::Tndcg::NAME_[abi:cxx11]" 
./include/metric/metricfactory.h:53: undefined reference to "metric::ir::Map::NAME_[abi:cxx11]" 
CMakeFiles/Project.dir/src/main.cc.o: in function "main": 
./src/main.cc:130: undefined reference to "learning::forests::LambdaMart::NAME_[abi:cxx11]" 
./src/main.cc:170: undefined reference to "learning::forests::Mart::NAME_[abi:cxx11]" 
./src/main.cc:171: undefined reference to "learning::forests::LambdaMart::NAME_[abi:cxx11]" 
./src/main.cc:172: undefined reference to "learning::forests::ObliviousMart::NAME_[abi:cxx11]" 
./src/main.cc:173: undefined reference to "learning::forests::ObliviousLambdaMart::NAME_[abi:cxx11]" 
./src/main.cc:174: undefined reference to "learning::linear::CoordinateAscent::NAME_[abi:cxx11]" 
./src/main.cc:175: undefined reference to "learning::forests::Project::NAME_[abi:cxx11]" 
./src/main.cc:176: undefined reference to "learning::CustomLTR::NAME_[abi:cxx11]" 
./src/main.cc:181: undefined reference to "metric::ir::Dcg::NAME_[abi:cxx11]" 
./src/main.cc:182: undefined reference to "metric::ir::Ndcg::NAME_[abi:cxx11]" 
./src/main.cc:183: undefined reference to "metric::ir::Tndcg::NAME_[abi:cxx11]" 
./src/main.cc:184: undefined reference to "metric::ir::Map::NAME_[abi:cxx11]" 
./src/main.cc:247: undefined reference to "metric::ir::Dcg::NAME_[abi:cxx11]" 
./src/main.cc:248: undefined reference to "metric::ir::Ndcg::NAME_[abi:cxx11]" 
./src/main.cc:249: undefined reference to "metric::ir::Tndcg::NAME_[abi:cxx11]" 
./src/main.cc:250: undefined reference to "metric::ir::Map::NAME_[abi:cxx11]" 
./src/main.cc:319: undefined reference to "learning::forests::LambdaMart::NAME_[abi:cxx11]" 
./src/main.cc:324: undefined reference to "learning::forests::Mart::NAME_[abi:cxx11]" 
./src/main.cc:329: undefined reference to "learning::forests::ObliviousMart::NAME_[abi:cxx11]" 
./src/main.cc:334: undefined reference to "learning::forests::ObliviousLambdaMart::NAME_[abi:cxx11]" 
./src/main.cc:339: undefined reference to "learning::linear::CoordinateAscent::NAME_[abi:cxx11]" 
./src/main.cc:346: undefined reference to "learning::linear::CoordinateAscent::CoordinateAscent(unsigned int, double, double, unsigned int, unsigned int)" 
./src/main.cc:347: undefined reference to "learning::forests::Project::NAME_[abi:cxx11]" 
./src/main.cc:351: undefined reference to "learning::CustomLTR::NAME_[abi:cxx11]" 
./src/main.cc:352: undefined reference to "learning::CustomLTR::CustomLTR()" 
(other errors lines) 
collect2: error: ld returned 1 exit status 
make[2]: *** [Project] Error 1 
make[1]: *** [CMakeFiles/Project.dir/all] Error 2 
make: *** [all] Error 2 
+1

Sieht aus, als wären die Funktionen 'learning ::' namespace irgendwo unter 'src/learning' implementiert, also müssen Sie diese Quellen auch kompilieren. Ähnlich für andere Namespaces (z. B. metric :: '). – Tsyvarev

+0

Entschuldigung, wie kann ich sie kompilieren? Kannst du bitte ein Beispiel machen? – Draxent

+1

Alle Quellen im 'add_executable()' Befehl nach 'src/main.cc' auflisten. – Tsyvarev

Antwort

0

Ok, löse ich es dank der Hilfe von Tsyvarev.
./CMakeLists.txt

cmake_minimum_required(VERSION 3.3) 
project(Project) 
set(DCMAKE_CXX_COMPILER "g++-5") 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 
find_package(Boost 1.57.0 COMPONENTS program_options system filesystem REQUIRED) 
find_package(OpenMP) 
if (OPENMP_FOUND) 
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") 
endif() 
include_directories(${Boost_INCLUDE_DIRS}) 
include_directories("include") 
file(GLOB_RECURSE SOURCES src/*.cc) #*/ 
add_executable(Project ${SOURCES}) 
target_link_libraries(Project ${Boost_LIBRARIES}) 

wo ich file(GLOB_RECURSE SOURCES src/*.cc) verwendeten Quellen statt include_directories("src") hinzuzufügen.