CMake не генерирует зависимые объектные файлы

Я пишу небольшой компилятор, но теперь я застрял в cmake, который не генерирует все зависимые объектные файлы.

Только main.cpp компилируется:

#include <iostream>
#include "lexer.h"#include "parser.h"
int main() {
Lexer lexer(&std::cin);
Parser parser(&lexer);

parser.binaryOpPrecedence['<'] = 10;
parser.binaryOpPrecedence['+'] = 20;
parser.binaryOpPrecedence['-'] = 20;
parser.binaryOpPrecedence['*'] = 40;

std::cerr << "ready> ";
parser.getNextToken();

parser.parse();

return 0;
}

мой CMakeLists.txt является следующим (подкаталог):

set(SOURCE_FILES
${PROJECT_SOURCE_DIR}/src/ast/binary.h
${PROJECT_SOURCE_DIR}/src/ast/call.h
${PROJECT_SOURCE_DIR}/src/ast/expression.h
${PROJECT_SOURCE_DIR}/src/ast/function.h
${PROJECT_SOURCE_DIR}/src/ast/number.h
${PROJECT_SOURCE_DIR}/src/ast/prototype.h
${PROJECT_SOURCE_DIR}/src/ast/variable.h
${PROJECT_SOURCE_DIR}/src/lexer.cpp
${PROJECT_SOURCE_DIR}/src/parser.cpp
PARENT_SCOPE
)

add_executable(kaleidoscope main.cpp ${SOURCE_FILES})

Как сказал только main.cpp составлен в main.cpp.o но нет lexer.cpp а также parser.cpp, так что компоновщик падает с неразрешенными символами. Не знаю, что я сделал не так.

/usr/bin/cmake --build /home/patkar/.clion10/system/cmake/generated/d6bd25de/d6bd25de/Debug --target kaleidoscope -- -j 4
Scanning dependencies of target kaleidoscope
[100%] Building CXX object src/CMakeFiles/kaleidoscope.dir/main.cpp.o
Linking CXX executable kaleidoscope
CMakeFiles/kaleidoscope.dir/main.cpp.o: In function `Lexer':
/home/patkar/workspace/compiler-fun/kaleidoscope/src/lexer.h:49: undefined reference to `vtable for Lexer'
CMakeFiles/kaleidoscope.dir/main.cpp.o: In function `main':
/home/patkar/workspace/compiler-fun/kaleidoscope/src/main.cpp:36: undefined reference to `Parser::parse()'
CMakeFiles/kaleidoscope.dir/main.cpp.o: In function `~Lexer':
/home/patkar/workspace/compiler-fun/kaleidoscope/src/lexer.h:38: undefined reference to `vtable for Lexer'
/home/patkar/workspace/compiler-fun/kaleidoscope/src/lexer.h:38: undefined reference to `vtable for Lexer'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [src/kaleidoscope] Error 1
make[2]: *** [src/CMakeFiles/kaleidoscope.dir/all] Error 2
make[1]: *** [src/CMakeFiles/kaleidoscope.dir/rule] Error 2
make: *** [kaleidoscope] Error 2

0

Решение

Хорошо, это был PARENT_SCOPE который сделал мой SOURCE_FILES переменная недоступна / пуста в текущей области видимости: O

Мне нужно это для моей цели тестирования, чтобы получить доступ ко всем исходным файлам. Теперь я создал новую переменную с PARENT_SCOPE как обходной путь.

set(SOURCE_FILES
${PROJECT_SOURCE_DIR}/src/ast/binary.h
${PROJECT_SOURCE_DIR}/src/ast/call.h
${PROJECT_SOURCE_DIR}/src/ast/expression.h
${PROJECT_SOURCE_DIR}/src/ast/function.h
${PROJECT_SOURCE_DIR}/src/ast/number.h
${PROJECT_SOURCE_DIR}/src/ast/prototype.h
${PROJECT_SOURCE_DIR}/src/ast/variable.h
${PROJECT_SOURCE_DIR}/src/lexer.cpp
${PROJECT_SOURCE_DIR}/src/parser.cpp
)

set(SOURCE_TEST_FILES ${SOURCE_FILES} PARENT_SCOPE)

add_executable(kaleidoscope main.cpp ${SOURCE_FILES})
1

Другие решения