2016-06-29 95 views
0

我想用CMake使用Visual Studio 14构建一个c项目,但是我无法覆盖由CMake设置的导致项目无法构建的编译器标志。我在我的CMakeLists.txt文件中使用此方法CMake覆盖本地编译器标志

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}) 

任何帮助将不胜感激!

编辑:主要的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具有类似于这个

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

误差的CMakeLists.txt是连接由于错误代码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

我已经给你的代码尝试了一些小的修改,可以成功地应用这些编译器/链接器选项。它包括我和@Tsyvarev建议的更改(引用和使用CMAKE_SHARED_LINKER_FLAGS),并且已经删除了对Windows SDK 7.1的静态引用。

> 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) 

建议

:这可以通过-T工具箱选项进行设置为了保持您的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'只能在工具链或'-T'命令行参数中设置。并了解您的活动构建配置。例如。 'CMAKE_C_FLAGS_DEBUG'和朋友被追加到'CMAKE_C_FLAGS'。 – Florian

+0

你的答案教给我多种新东西,其中最重要的是CMake有一些选项,除非你使用CMake --help-full(例如-B选项) 编辑:其实,-B似乎是一个CPack选项。我想我不明白你使用-H和-B标志。 -H用于帮助,-B未列为CMake选项。 –