2016-06-29 2 views
0

Я пытаюсь создать проект c с CMake с помощью Visual Studio 14, однако я не могу переопределить флаги компилятора, установленные CMake, которые вызывают неудачу сборки проекта. Я использую этот метод в своем файле CMakeLists.txtCMake переопределять собственные флаги компилятора

set(flags /nologo /c /EHsc /GS- /MTd /Od /TC /Zi /Zp2 /D _USING_V110_SDK71_) 
set(CMAKE_C_FLAGS ${flags}) 
set(rc_flags /l0x809) 
set(CMAKE_RC_FLAGS ${rc_flags}) 
set(linker_flags /NOLOGO /SUBSYSTEM:console /MACHINE:I386 /DLL) 
set(CMAKE_LINKER_FLAGS ${linker_flags}) 

Любая помощь будет очень признательна!

Edit: полный пример главного CMakeLists.txt здесь

cmake_minimum_required(VERSION 3.4) 
project(cuism C) 

set(WINDOWS_SDK_INCLUDES "C:/Program Files\ (x86)/Microsoft\ SDKs/Windows/v7.1A/Include/") 
set(WINDOWS_SDK_LIBRARIES "C:/Program Files\ (x86)/Microsoft\ SDKs/Windows/v7.1A/Lib") 
set(WSOCK "WSock32.lib") 
set(ODBC "odbc32.lib") 
set(ODBCCP "odbccp32.lib") 

set(includeDir "${CMAKE_SOURCE_DIR}/include/") 
set(resourceDir "${CMAKE_SOURCE_DIR}/resources/") 


include_directories(
    ${includeDir} 
    ${resourceDir} 
) 

set(CMAKE_LIBRARY_PATH ${WINDOWS_SDK_LIBRARIES}) 
set(CMAKE_INCLUDE_PATH ${WINDOWS_SDK_INCLUDES}) 


set(flags "/nologo /c /EHsc /GS- /MTd /Od /TC /Zi /Zp2 /D _USING_V110_SDK71_") 
set(CMAKE_C_FLAGS ${flags}) 

set(rc_flags /l0x809) 
set(CMAKE_RC_FLAGS ${rc_flags}) 

set(linker_flags /NOLOGO /SUBSYSTEM:console /DLL) 
set(CMAKE_LINKER_FLAGS ${linker_flags}) 

message(c flags are ${CMAKE_C_FLAGS}) 
message(rc flags are ${CMAKE_RC_FLAGS}) 
message(linker flags are ${CMAKE_LINKER_FLAGS}) 
message(linker EXE flags are ${CMAKE_EXE_LINKER_FLAGS}) 

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) 
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) 
set(RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) 


ADD_SUBDIRECTORY(cuimbct) 
ADD_SUBDIRECTORY(cuimb) 
ADD_SUBDIRECTORY(cuidll) 

Каждый sudbdirectory имеет CMakeLists.txt похожее на этот один

set(src cuimb.c "${includeDir}port.c" cuimben.c cuimb.rc) 
add_library(cuimb SHARED ${src}) 
target_link_libraries(cuimb ${WSOCK} ${ODBC} ${ODBCCP}) 

Ошибка находится в процессе подключения стадии из-за ошибки кода LNK2019

+0

Что вы пытаетесь до сих пор? Когда вышеуказанный код находится за командой 'project()', я бы сказал, что он должен работать. Для получения дополнительной информации, что и как это работает для меня, см., Например, [Здесь] (http://stackoverflow.com/questions/33828855/is-cmake-set-variable-recursive). – Florian

+0

Пробовал и методы add_definitions() и add_compile_options() –

+0

Просто угадайте: вы пытались добавить кавычки в код выше, например 'set (flags)/nologo/c/EHsc/GS-/MTd/Od/TC/Zi/Zp2/D _USING_V110_SDK71 _ ")'? – Florian

ответ

1

Я дал вашему коду попытку и - с небольшими изменениями - смог успешно применить эти параметры компилятора/компоновщика. Он включает изменения I и @ Цыварев (цитаты и использование CMAKE_SHARED_LINKER_FLAGS), и я удалил статические ссылки на Windows SDK 7.1. Это может быть установлено с возможностью -T набора инструментов:

> cmake -H"." -B"buildWin7" -T"v140_xp" -G"Visual Studio 14 2015" 
... 

CMakeLists.txt

cmake_minimum_required(VERSION 3.5) 

project(cuism C) 

set(includeDir "${CMAKE_SOURCE_DIR}/include/") 
set(resourceDir "${CMAKE_SOURCE_DIR}/resources/") 

include_directories(
    ${includeDir} 
    ${resourceDir} 
) 

set(flags "/nologo /c /EHsc /GS- /MTd /Od /TC /Zi /Zp2") 
set(CMAKE_C_FLAGS "${flags}") 

set(rc_flags "/l0x809") 
set(CMAKE_RC_FLAGS "${rc_flags}") 

set(linker_flags "/NOLOGO /SUBSYSTEM:console /DLL") 
set(CMAKE_SHARED_LINKER_FLAGS "${linker_flags}") 

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) 
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) 
set(RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) 

... 

cuimb \ CMakeLists.txt

... 

add_library(cuimb SHARED ${src}) 
target_link_libraries(cuimb wsock32 odbc32 odbccp32) 

Рекомендация

Чтобы ваш код сценария CMake был чистым, переместите все параметры компилятора/компоновщика в файл инструментальной цепочки. И я добавил некоторые из параметров, которые я обычно определял там. Плюс я уменьшил его до одной конфигурации MyDebug (только Debug добавит другие опции отладки), потому что ваши варианты, похоже, не сделаны для Release.

> cmake -H"." -B "buildWin7" -DCMAKE_TOOLCHAIN_FILE:PATH="VS2015Toolchain.cmake" -G"Visual Studio 14 2015" 
... 

VS2015Toolchain.cmake

if (NOT CMAKE_GENERATOR_TOOLSET) 
    set(CMAKE_GENERATOR_TOOLSET "v140_xp" CACHE INTERNAL "") 
endif() 

set(CMAKE_CONFIGURATION_TYPES "MyDebug" CACHE INTERNAL "") 

# NOTE: Standard is a console app. If you need a windows app, 
#  use WIN32 define in add_executable 
set(CMAKE_WIN32_EXECUTABLE 0 CACHE INTERNAL "") 

set(CMAKE_C_FLAGS "/nologo /c /EHsc /GS- /MTd /Od /TC /Zi /Zp2 /W4" CACHE INTERNAL "") 
set(CMAKE_RC_FLAGS "/l0x809" CACHE INTERNAL "") 
set(
    CMAKE_SHARED_LINKER_FLAGS 
    "/NOLOGO /SAFESEH:NO /INCREMENTAL:NO /debug" 
    CACHE INTERNAL "" 
) 

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH CACHE INTERNAL "") 
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY CACHE INTERNAL "") 
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY CACHE INTERNAL "") 
+0

Спасибо @Florian Я бы использовал этот подход, как только я сделаю прикладную кросс-платформу и имею более одной цепочки инструментов. –

+0

@ simon-p-r Добро пожаловать. Просто имейте в виду, что 'CMAKE_GENERATOR_TOOLSET' может быть установлен только в toolchain или через параметр командной строки' -T'. Помните о своей активной конфигурации сборки. Например. 'CMAKE_C_FLAGS_DEBUG' и друзья добавляются в' CMAKE_C_FLAGS'. – Florian

+0

Ваш ответ научил меня нескольким новым вещам, не последним из которых является то, что у CMake есть некоторые опции, которые не отображаются, если вы не CMake -help-full (например, опция -B) EDIT: На самом деле, -B кажется быть опцией CPack. Наверное, я не понимаю вашего использования флагов -H и -B. -H для справки и -B не указан в качестве опции CMake. –

Смежные вопросы