首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMake不生成依赖的对象文件

CMake不生成依赖的对象文件
EN

Stack Overflow用户
提问于 2015-01-04 11:21:42
回答 1查看 991关注 0票数 0

我正在编写一个小编译器,但现在我只能使用cmake,它不能生成所有依赖的对象文件。

只编译了main.cpp

代码语言:javascript
复制
#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是以下(子目录):

代码语言:javascript
复制
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.cppparser.cpp,因此链接器会以未解析的符号崩溃。不知道,我做错了什么。

代码语言:javascript
复制
/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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-04 11:46:17

好的,是PARENT_SCOPE使我的SOURCE_FILES变量在当前范围内不可访问/为空:O

我需要这个作为我的测试目标访问那里的所有源文件。现在,我创建了一个新变量,使用PARENT_SCOPE作为解决方法。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27764988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档