2012-10-17 4 views
0

je suit la structure de répertoire:CMake: référence non définie à la fonction

├── build (empty dir) 
    ├── CMakeLists.txt 
    ├── easylogging++.h 
    ├── help.h 
    ├── operation.h 
    ├── operation_list.h 
    ├── operations 
    │   ├── CMakeLists.txt 
    │   ├── matchcount.cc 
    │   └── matchcount.h 
    └── ops_toolkit.cc 

Je suis nouveau à CMake et essayer d'écrire CMakeLists.txt. Mon matchcount.h a une signature dont l'implémentation est dans matchcount.cc (comme structure C/C++ typique). Ce qui suit est mon CMakeLists.txt dans le répertoire de base

cmake_minimum_required(VERSION 2.6) 
project(ops_toolkit) 

add_subdirectory(operations) 

add_executable(ops_toolkit ops_toolkit.cc) 
set(CMAKE_CXX_FLAGS "-std=c++0x") 

et suivant est celui dans les opérations répertoire

include_directories(${ops_toolkit_SOURCE_DIR}/operations) 
link_directories(${ops_toolkit_BINARY_DIR}/operations) 
set(all_operations_HEADER operations/matchcount.h) 
set(all_operations_SOURCES operations/matchcount.cc) 

Je reçois référence non définie à la signature de fonction appelée int matchcount(int, const char**) et faire PLAINT suivant

dev:~/work/ops_toolkit/build$ make 
Scanning dependencies of target ops_toolkit 
[100%] Building CXX object CMakeFiles/ops_toolkit.dir/ops_toolkit.cc.o 
Linking CXX executable ops_toolkit 
CMakeFiles/ops_toolkit.dir/ops_toolkit.cc.o: In function `__static_initialization_and_destruction_0(int, int)': 
ops_toolkit.cc:(.text+0x249): undefined reference to `operations::matchcount(int, char const**)' 
collect2: ld returned 1 exit status 
make[2]: *** [ops_toolkit] Error 1 
make[1]: *** [CMakeFiles/ops_toolkit.dir/all] Error 2 
make: *** [all] Error 2 

Quelqu'un peut-il m'aider? Merci

+1

Implémentez-vous les opérations :: matchcount (int, char const **)? –

+0

@LuchianGrigore C'est une autre chose, je n'ai pas de déclaration ou de définition avec cette signature, j'ai des opérations :: matchcount (int, const char **). Et oui j'ai implémentation de celui-ci dans matchcount.cc – abumusamq

+0

'char const **' est la même chose que 'const char **'. Est-ce que matchcount est un projet? – Synxis

Répondre

0

Le problème vient de la add_subdirectory et son associé CMakeLists.txt (celui ./operations), ce qui est incorrect, voir this SO question for the implications of the add_subdirectory command.

Je vous conseille également de mettre include_directories et link_directories dans le fichier CMake principal, pour plus de clarté.

+0

donc inclure et relier les répertoires dans le fichier CMake principal est suffisant et nous n'avons pas besoin de les inclure dans les sous-répertoires)? Si oui, que devrait contenir exactement les fichiers sub-CMake? – abumusamq

+0

Les sous-répertoires doivent être sous-projet (juste un fichier CMake normal avec 'project ',' include_directories', etc ...) ou modules (juste des variables 'set' dans la portée parent, comme les sources, en-têtes et autres config) . – Synxis

Questions connexes