2016-06-29 93 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選項。 –