我正在编写一个小编译器,但现在我卡住了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
您确认'SOURCE_FILES'设置为正确的路径吗? – 2015-01-04 11:25:46
不是直接的,但是路径是正确的,因为我也在测试目标中使用了'SOURCE_FILES',它在那里工作。就是这样,'PARENT_SCOPE'在当前范围内使变量不可访问/为空? – 2015-01-04 11:50:37
是的,我遇到了同样的问题。不幸的是,[documentation](http://www.cmake.org/cmake/help/v3.0/command/set.html)也没有提供这种行为的任何规范。你可以通过在父范围中设置它,它也可以在当前范围内访问。 – 2015-01-04 12:01:57