2016-07-22 36 views
1

Ich versuche, CMake zu lernen, aber ich bekomme einen undefinierten Verweis auf ... Linker Fehler Ich habe ein Verzeichnis mit einem Unterverzeichnis. jeder von ihnen hat seine eigene CMakeLists.txtundefined Verweis auf Funktion CMake

test 
|----main.cpp 
|----CMakeLists.txt 
|----test2 
    |----foo.hpp 
    |----foo.cpp 
    |----CMakeLists.txt 

die CMakeLists.txt für Test:

cmake_minimum_required(VERSION 3.5) 
project(tests) 

add_subdirectory(test2) 
set(SOURCE_FILES main.cpp) 
add_executable(tests ${SOURCE_FILES}) 

die CMakeLists.txt für test2 ist:

set(test2_files 
     foo.cpp 
     foo.hpp 
     ) 
add_library(test2 ${test2_files}) 

foo.cpp implementiert ein Funktion, die in foo.hpp für diese Funktion definiert ist, bekomme ich den undefinierten Referenzfehler. Was mache ich falsch? Wie kann ich diesen Linkers Fehler

EDIT los: Mein CMakeLists.txt sieht nun so aus, aber ich habe noch die Linker Fehler:

project(tests) 

cmake_minimum_required(VERSION 2.8) 

set(SOURCE_FILES main.cpp) 

include_directories(test2) 
link_directories(test2) 

add_subdirectory(test) 

add_executable(${PROJECT_NAME} ${SOURCE_FILES}) 

target_link_libraries(${PROJECT_NAME} test2) 

Ich versuchte es auch mit dem absoluten Pfad statt test2

EDIT: löste es war nur ein Tippfehler in der CMakeLists.txt von test2.

Antwort

4

Stellen Sie sicher, dass Ihr Test CMakeLists.txt mit der erstellten Bibliothek verknüpft ist.

project(test) 

cmake_minimum_required(VERSION 2.8) 

set(SOURCE_FILES main.cpp) 

include_directories(test2) 

#here 
link_directories(test2) 

add_subdirectory(test2) 

add_executable(${PROJECT_NAME} ${SOURCE_FILES}) 

#and here 
target_link_libraries(${PROJECT_NAME} test2) 
+0

Wenn ich das benutze ich diese Störung erhalten: '/ usr/ist/ld: nicht -ltest2' – Exagon

+0

Added eine Linie finden kann, geben Sie die oberste Ebene einen lokalen für Linkverzeichnisse. – DaveyLaser

+0

Möchten Sie, dass es * .a oder * .so ist? Diese Implementierung generiert eine * .a-Datei im Build-Verzeichnis. – DaveyLaser

0

Funktion add_subdirectory($dir) nicht automatisch $dir hinzufügen Verzeichnisse und Link-Verzeichnisse aufzunehmen. So verwenden Bibliothek test2 Sie es manuell in CMakeLists.txt von test Verzeichnis tun sollten:

include_directories(test2/) 
link_directories(test2/) 

Verknüpfen Sie dann die ausführbare Datei mit test2 Bibliothek Funktionen Definitionen zu erhalten. In dem CMakeLists.txt von test Verzeichnis:

target_link_libraries(tests test2)