2015-01-04 2 views
0

저는 약간의 컴파일러를 작성하고 있습니다 만, 이제는 모든 의존 객체 파일을 생성하지 않는 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 인 다음 (하위) :

으로 만 main.cpp하지 lexer.cppparser.cpp 때문에 링커를 main.cpp.o로 컴파일되지만 말했다
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}) 

해결되지 않은 기호로 충돌합니다. 모르겠다. 내가 잘못한 것을. O

내가 거기에 모든 소스 파일에 액세스 할 수 내 테스트 대상이 필요합니다

/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

'SOURCE_FILES'이 (가) 올바른 경로로 설정되어 있는지 확인 했습니까? –

+0

테스트 타겟에서'SOURCE_FILES'를 사용하기 때문에 경로가 정확하지 않습니다. 그리고 그것입니다,'PARENT_SCOPE'는 현재 범위에서 변수를 접근 불가능/비게 했습니까? –

+1

그래,이 같은 문제가 발생했습니다. 안타깝게도 [documentation] (http://www.cmake.org/cmake/help/v3.0/command/set.html)은이 동작에 대한 사양을 제공하지 않습니다. 상위 범위에서 설정하면 현재 범위에서도 액세스 할 수 있다고 생각할 것입니다. –

답변

1

좋아, 내 SOURCE_FILES 변수 현재 범위에서 빈/액세스 할 수 없게 만든 PARENT_SCOPE이었다. 이제 해결 방법으로 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}) 
+0

'add_executable (kaleidoscope main.cpp $ {SOURCE_TEST_FILES})'를 의미하는 것 같아요 : P –

+1

아니요,'add_executable (만화경 main.cpp $ {SOURCE_FILES})'가 맞습니다. 'SOURCE_TEST_FILES'는 테스트 실행 파일에서 그것을 액세스하는'PARENT_SCOPE'가있는 것입니다. –

관련 문제