2016-04-17 10 views
0

Ich bekomme einen Build-Fehler beim Versuch, ein Flex-und Zitronen-Projekt mit CMake zu bauen. Kannst du mir helfen zu finden, was falsch ist?bauen Fehler mit CMake

$ make 
/usr/bin/cmake -H/home/dac/ClionProjects/openshell -B/home/dac/ClionProjects/openshell --check-build-system CMakeFiles/Makefile.cmake 0 
/usr/bin/cmake -E cmake_progress_start /home/dac/ClionProjects/openshell/CMakeFiles /home/dac/ClionProjects/openshell/CMakeFiles/progress.marks 
make -f CMakeFiles/Makefile2 all 
make[1]: Entering directory '/home/dac/ClionProjects/openshell' 
make -f CMakeFiles/lemon.dir/build.make CMakeFiles/lemon.dir/depend 
make[2]: Entering directory '/home/dac/ClionProjects/openshell' 
cd /home/dac/ClionProjects/openshell && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/dac/ClionProjects/openshell /home/dac/ClionProjects/openshell /home/dac/ClionProjects/openshell /home/dac/ClionProjects/openshell /home/dac/ClionProjects/openshell/CMakeFiles/lemon.dir/DependInfo.cmake --color= 
make[2]: Leaving directory '/home/dac/ClionProjects/openshell' 
make -f CMakeFiles/lemon.dir/build.make CMakeFiles/lemon.dir/build 
make[2]: Entering directory '/home/dac/ClionProjects/openshell' 
make[2]: Nothing to be done for 'CMakeFiles/lemon.dir/build'. 
make[2]: Leaving directory '/home/dac/ClionProjects/openshell' 
/usr/bin/cmake -E cmake_progress_report /home/dac/ClionProjects/openshell/CMakeFiles 1 
[ 16%] Built target lemon 
make -f CMakeFiles/openshell.dir/build.make CMakeFiles/openshell.dir/depend 
make[2]: Entering directory '/home/dac/ClionProjects/openshell' 
cd /home/dac/ClionProjects/openshell && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/dac/ClionProjects/openshell /home/dac/ClionProjects/openshell /home/dac/ClionProjects/openshell /home/dac/ClionProjects/openshell /home/dac/ClionProjects/openshell/CMakeFiles/openshell.dir/DependInfo.cmake --color= 
Scanning dependencies of target openshell 
make[2]: Leaving directory '/home/dac/ClionProjects/openshell' 
make -f CMakeFiles/openshell.dir/build.make CMakeFiles/openshell.dir/build 
make[2]: Entering directory '/home/dac/ClionProjects/openshell' 
/usr/bin/cmake -E cmake_progress_report /home/dac/ClionProjects/openshell/CMakeFiles 2 
[ 33%] Building C object CMakeFiles/openshell.dir/main.c.o 
/usr/bin/cc -Wall -Werror -O3 -std=c99 -I/usr/include/readline -o CMakeFiles/openshell.dir/main.c.o -c /home/dac/ClionProjects/openshell/main.c 
Linking C executable openshell 
/usr/bin/cmake -E cmake_link_script CMakeFiles/openshell.dir/link.txt --verbose=1 
/usr/bin/cc -Wall -Werror -O3 -std=c99 CMakeFiles/openshell.dir/main.c.o CMakeFiles/openshell.dir/errors.c.o CMakeFiles/openshell.dir/util.c.o CMakeFiles/openshell.dir/stack.c.o CMakeFiles/openshell.dir/flex/shellparser.c.o -o openshell -rdynamic -lreadline 
CMakeFiles/openshell.dir/main.c.o: In function `main': 
main.c:(.text.startup+0xef): undefined reference to `yylex_init' 
main.c:(.text.startup+0x100): undefined reference to `yyset_in' 
main.c:(.text.startup+0x12e): undefined reference to `yylex' 
main.c:(.text.startup+0x13a): undefined reference to `yyget_text' 
main.c:(.text.startup+0x178): undefined reference to `yylex_destroy' 
collect2: error: ld returned 1 exit status 
CMakeFiles/openshell.dir/build.make:188: recipe for target 'openshell' failed 
make[2]: *** [openshell] Error 1 
make[2]: Leaving directory '/home/dac/ClionProjects/openshell' 
CMakeFiles/Makefile2:98: recipe for target 'CMakeFiles/openshell.dir/all' failed 
make[1]: *** [CMakeFiles/openshell.dir/all] Error 2 
make[1]: Leaving directory '/home/dac/ClionProjects/openshell' 
Makefile:78: recipe for target 'all' failed 
make: *** [all] Error 2 

Meine CMake Build-Datei ist

cmake_minimum_required (VERSION 2.6) 
project (openshell) 
set(CMAKE_VERBOSE_MAKEFILE on) 
include_directories(/usr/include/readline) 

#### Lemon bootstrap #### 
ADD_EXECUTABLE(lemon lemon.c) 


file(GLOB SOURCES "./*.c") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -O3 -std=c99") 
add_executable(openshell main.c openshell.h errors.c errors.h util.c util.h stack.c stack.h flex/shellparser.c flex/shellscanner.l flex/shellscanner.h) 
target_link_libraries(openshell readline) 

Antwort

0

Sie sind nicht die Flex-Bibliothek verknüpft, so dass Sie Linkerfehler für alle Flex-Funktionen erhalten Sie, wie yyset_in verwenden.

können Sie find_package(FLEX) verwenden und nach FLEX_TARGET mit Flex-Ziele zu definieren, können Sie dann in etwa wie folgt verwendet werden:

# Note: I use "ShellScanner" below as in FLEX_TARGET(ShellScanner flex/shellscanner.l ...) 
add_executable(openshell 
    ... 
    flex/shellparser.c 
    ${FLEX_ShellScanner_OUTPUTS} 
) 
target_link_libraries(openshell ${READLINE_LIBRARY} ${FLEX_LIBRARIES}) 

Siehe FindFLEX für weitere Informationen.

Allerdings sehe ich kein FindReadline.cmake Modul mit den anderen Modulen, die CMake standardmäßig zur Verfügung stellt, also müssen Sie vielleicht selbst eines erstellen oder ein bestehendes verwenden, wie das, das ich gerade verlinkt habe. Es gibt auch die Bibliothek Editline, die ähnliche Funktionen bietet, und Sie können dafür auch eine vorhandene Datei FindEditline.cmake verwenden.