2016-06-29 8 views
0

Ich versuche ein c-Projekt mit CMake mit Visual Studio 14 zu erstellen, aber ich kann nicht die Compiler-Flags überschreiben, die von CMake gesetzt werden, was dazu führt, dass das Projekt fehlschlägt. Ich benutze diese Methode in meiner CMakeLists.txt-DateiCMake überschreiben native Compiler-Flags

Jede Hilfe würde sehr geschätzt werden!

Edit: vollständiges Beispiel der Haupt CMakeLists.txt ist hier

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) 

Jede sudbdirectory eine CMakeLists.txt ähnlich wie diese

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

Fehler ist während des Linkens Stufe aufgrund Fehlercode LNK2019 man hat

+0

Was Sie bisher versuchte? Wenn der obige Code hinter dem Befehl 'project()' steht, würde ich sagen, dass es funktionieren sollte. Für weitere Details was und wie es für mich funktioniert siehe z. [hier] (http://stackoverflow.com/questions/33828855/is-cmake-set-variable-recursive). – Florian

+0

Erprobt sowohl add_definitions() und add_compile_options() Methoden –

+0

Nur eine Vermutung: haben Sie versucht, den obigen Code wie 'set (Flags)/nologo/c/EHsc/GS-/MTd/Od/TC/Zi/Zitate hinzufügen Zp2/D _USING_V110_SDK71 _ ")'? – Florian

Antwort

1

Ich habe Ihren Code versucht und - mit einigen kleinen Änderungen - konnte diese Compiler/Linker-Optionen erfolgreich anwenden. Es enthält die Änderungen, die ich und @Tsyvarev vorgeschlagen haben (Anführungszeichen und Verwendung von CMAKE_SHARED_LINKER_FLAGS), und ich habe die statischen Verweise auf Windows SDK 7.1 entfernt. Dies kann mit der -T Toolset Option eingestellt werden:

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

Empfehlung

Um Ihren CMake-Skriptcode sauber zu halten, sollten Sie alle Compiler/Linker-Optionen in eine Toolchain-Datei verschieben. Und ich habe einige der Optionen hinzugefügt, die ich dort normalerweise definiert habe. Außerdem habe ich es auf eine einzige Konfiguration reduziert MyDebug (nur würde andere Debug-Optionen anhängen), weil Ihre Optionen scheinen nicht für Release gemacht werden.

> 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

Dank @Florian Ich würde diesen Ansatz verwenden, sobald ich Anwendung Cross-Plattform machen und mehr als eine Werkzeugkette haben. –

+0

@ simon-p-r Gern geschehen. Beachten Sie, dass 'CMAKE_GENERATOR_TOOLSET' nur in der Toolchain oder über den Befehlszeilenparameter' -T' gesetzt werden kann. Und sei dir deiner aktiven Build-Konfiguration bewusst. Z.B. 'CMAKE_C_FLAGS_DEBUG' und Freunde werden an' CMAKE_C_FLAGS' angehängt. – Florian

+0

Ihre Antwort lehrte mich mehrere neue Dinge, nicht zuletzt ist, dass CMake einige Optionen hat, die nicht angezeigt werden, außer Sie CMake - Hilf voll (zB die Option -B) EDIT: Eigentlich scheint -B eine CPack-Option sein. Ich nehme an, ich verstehe deine Verwendung der -H- und -B-Flags nicht. -H ist Hilfe und -B ist nicht als CMake-Option aufgeführt. –

Verwandte Themen