У меня есть проект с использованием boost 1.60. В настоящее время сборка этого проекта не может со следующим сообщением:Проблемы при связывании с boost 1.60
libboost_thread-vc140-mt-1_60.lib(thread.obj) : fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'
Это должно быть легко решить, но это странное сообщение. Поэтому я подтвердил, что библиотеки boost были действительно x64
с dumpbin
. Специально, я проверил libboost_thread-vc140-mt-1_60.lib
и получил результат, 8664 machine (x64)
.
Мое следующее предположение было то, что CMake
делал что-то неправильно. Сброс некоторых переменных дал следующее:
-- BOOST_ROOT: D:\path\to\project\..\ext/boost
-- BOOST_LIBRARYDIR: D:\path\to\project\..\ext/boost/lib64
-- BOOST_INCLUDEDIR: D:\path\to\project\..\ext/boost/include
-- Boost version: 1.60.0
Это все допустимые пути. Кроме того, в этом разделе CMakeLists.txt
, кажется, действительно:
if(WIN32)
# set boost needed boost library parameters
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_LIBS ON)
set(BOOST_ROOT ${LIB_BOOST_ROOT_DIR})
set(BOOST_LIBRARYDIR ${LIB_BOOST_ROOT_DIR}/lib${LIB_SUFFIX})
set(BOOST_INCLUDEDIR ${LIB_BOOST_ROOT_DIR}/include)
message("-- Boost_USE_MULTITHREADED: ${Boost_USE_MULTITHREADED}")
message("-- Boost_USE_STATIC_LIBS: ${Boost_USE_STATIC_LIBS}")
message("-- BOOST_ROOT: ${BOOST_ROOT}")
message("-- BOOST_LIBRARYDIR: ${BOOST_LIBRARYDIR}")
message("-- BOOST_INCLUDEDIR: ${BOOST_INCLUDEDIR}")
find_package(BOOST 1.60 REQUIRED COMPONENTS thread system chrono regex filesystem iostreams log)
endif(WIN32)
Итак, что я здесь отсутствует?
EDIT
Сборка проекта осуществляется с ninja
. Когда я смотрю на CMakeCache.txt
, я вижу это:
//Flags used by the linker.
CMAKE_EXE_LINKER_FLAGS:STRING= /machine:x64
EDIT 2
И я посмотрел в сценарий сборки. Перед вызовом CMake, я начинаю vcvarsall.bat
с параметром amd64
.
Какая архитектура предназначена для вашей программы? x86 или x64? –
@ColinBasnett: Я редактировал вопрос. Вы можете видеть, что сборка установлена для x64. – kristian
Убедитесь, что правильная инструментальная цепочка Visual Studio установлена в вашем PATH во время компиляции как библиотек boost, так и вашей программы. Это означает, что вы должны запускать все свои команды из командной строки x64 VS, если вы ориентируетесь на x64. – ViNi89