Пример файла CMakeLists.txt для проекта LLVM
Мне сложно найти LLVM для работы над новым проектом. Я пробовал несколько примеров CMakeLists.txt из http://old.nabble.com/CMake-sample-project--td28871124.html и использовал много времени на нем.
Я могу полностью создать LLVM и примеры, но мне нужен проект, который не находится в папке LLVM. Я использую Visual Studio 2010 в Windows 7. Сейчас моя настройка такова:
root
- CMakeLists.txt (1)
main
- CMakeLists.txt (2)
- main.cpp (an exact copy of the Fibonacci example)
(1)
cmake_minimum_required(VERSION 2.6)
project (TestLLVM)
set(LLVM_SRC_DIR "MY FOLDER/llvm-2.9" CACHE PATH "Directory LLVM source (includes) are in")
set(LLVM_BIN_DIR "MY FOLDER/llvm-2.9-install" CACHE PATH "Directory LLVM binaries (libraries) are in")
set (CMAKE_BUILD_TYPE Debug)
add_definitions (-D_DEBUG)
link_directories(${LLVM_BIN_DIR}/lib/Release)
include_directories(${LLVM_SRC_DIR}/include ${LLVM_BIN_DIR}/include)
add_subdirectory (main)
(2)
if(NOT WIN32 OR MSYS OR CYGWIN)
set (PLATFORM_LIBS dl boost_system)
endif()
add_executable (main main.cpp)
target_link_libraries (main
${PLATFORM_LIBS}
LLVMX86Disassembler
LLVMX86AsmParser
LLVMX86AsmPrinter
LLVMX86CodeGen
LLVMSelectionDAG
LLVMAsmPrinter
LLVMMCParser
LLVMX86Info
LLVMJIT
LLVMExecutionEngine
LLVMCodeGen
LLVMScalarOpts
LLVMTransformUtils
LLVMipa
LLVMAnalysis
LLVMTarget
LLVMMC
LLVMCore
LLVMSupport
)
CMake
отлично работает и создает файл решения и т.д., но когда я компилирую проект, я получаю много нерешенных внешних и несовпадений из LLVMX86CodeGen.lib. И я также получаю следующее:
defaultlib 'MSVCRT' конфликтует с использованием других libs; use/NODEFAULTLIB: library
Проблема может иметь какое-то отношение к:
- Я удалил LLVMSystem
из списка, потому что он не был найден.
- Мои скомпилированные библиотеки находятся в /lib/Release/, а не /lib/, как показывают примеры.
Любая помощь с вышеупомянутой проблемой была бы большой помощью!:)
Ответы
Ответ 1
Ответ от arrowdodger приводит меня в правильном направлении:) Поскольку llvm_map_components_to_libraries
работал не так, как ожидалось, мне приходилось делать то, что он делает вручную, который находит правильный порядок зависимостей. Я придумал это:
set (LIBS
${LLVM_LIBRARIES_PATH}/LLVMSupport.lib
${LLVM_LIBRARIES_PATH}/LLVMCore.lib
${LLVM_LIBRARIES_PATH}/LLVMMC.lib
${LLVM_LIBRARIES_PATH}/LLVMTarget.lib
${LLVM_LIBRARIES_PATH}/LLVMAnalysis.lib
${LLVM_LIBRARIES_PATH}/LLVMipa.lib
${LLVM_LIBRARIES_PATH}/LLVMTransformUtils.lib
${LLVM_LIBRARIES_PATH}/LLVMInstCombine.lib
${LLVM_LIBRARIES_PATH}/LLVMScalarOpts.lib
${LLVM_LIBRARIES_PATH}/LLVMCodeGen.lib
${LLVM_LIBRARIES_PATH}/LLVMExecutionEngine.lib
${LLVM_LIBRARIES_PATH}/LLVMJIT.lib
${LLVM_LIBRARIES_PATH}/LLVMX86Utils.lib
${LLVM_LIBRARIES_PATH}/LLVMX86Info.lib
${LLVM_LIBRARIES_PATH}/LLVMMCParser.lib
${LLVM_LIBRARIES_PATH}/LLVMX86AsmParser.lib
${LLVM_LIBRARIES_PATH}/LLVMX86AsmPrinter.lib
${LLVM_LIBRARIES_PATH}/LLVMAsmPrinter.lib
${LLVM_LIBRARIES_PATH}/LLVMSelectionDAG.lib
${LLVM_LIBRARIES_PATH}/LLVMX86CodeGen.lib
${LLVM_LIBRARIES_PATH}/LLVMX86Disassembler.lib
${LLVM_LIBRARIES_PATH}/LLVMInterpreter.lib
)
target_link_libraries(main ${LIBS})
И тогда у меня возникли проблемы с debug/release lib для LLVMX86Utils
(_ITERATOR_DEBUG_LEVEL
).
Ответ 2
Вот вам вся необходимая информация: http://llvm.org/docs/CMake.html#embedding-llvm-in-your-project.
Вы наблюдаете такую проблему, потому что некоторые линкеры не могут автоматически связывать статические библиотеки в правильном порядке. Для этого вам нужно использовать функцию llvm_map_components_to_libraries.