2016-04-17 4 views
0

Я получаю ошибку сборки при попытке создания проекта flex и лимона с помощью CMake. Можете ли вы помочь мне найти то, что не так?Ошибка сборки при использовании 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 

Мой CMake строить файл

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) 

ответ

0

Вы не связывая библиотеки Flex, так что вы получите ошибки компоновщика для любых Flex функций, которые вы используете, например, yyset_in.

Вы можете использовать find_package(FLEX) и после использования FLEX_TARGET для определения ваших целей Flex, вы можете использовать что-то вроде следующего:

# 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}) 

См FindFLEX для получения дополнительной информации.

Однако, я не вижу модуль FindReadline.cmake с другими модулями, которые CMake предоставляет по умолчанию, поэтому вам может потребоваться создать их самостоятельно или использовать существующий, такой как тот, который я только что связал. Также есть библиотека Editline, которая обеспечивает аналогичную функциональность, и вы также можете использовать существующий файл FindEditline.cmake.