2017-06-29 4 views
0

Ich habe ein Batch-Skript, das beim Ausführen einfach einen Cmake-Befehl aufruft, um ein Visual Studio C++ - Projekt zu erstellen. Dieses Projekt sollte jedoch zwei Verweise auf zwei statische Bibliotheken haben ... Trotzdem, egal was ich versuche, kann ich mein Projekt nicht dazu bringen, die Bibliotheken korrekt zu verknüpfen. Hier ist, wie meine Ordnerstruktur aussieht:CMake verbindet keine Bibliotheksdateien

. 
+-- build 
| +-- x64 
|  +-- DebugStatic 
|   +-- mylibA_static.lib 
|   +-- mylibB_static.lib 
+-- Include 
+-- Source 
+-- myproject 
| +-- Demo 
|  +-- build 
|  +-- cmake 
|   +-- GenerateVS2015.bat 
|  +-- CMakeLists.txt 
|  +-- Demo.cpp 
|  +-- stdafx.cpp 

Nun, ich bin mit dem Batch-Skript aus dem Cmake Ordner in der Ordnerstruktur Demo-Projektes. Mein Stapel Skript ist wie folgt:

@echo off 
set startingDir=%CD% 

set basepath=%~dp0 
set builddir=%basepath%\..\build 
if not exist %builddir% (mkdir %builddir%) 
cd %builddir% 
cmake -G "Visual Studio 14 2015 Win64" .. %* 

cd %startingDir% 

Nichts zu kompliziert. Nun schauen wir uns die Datei CMakeLists.txt aussehen:

cmake_minimum_required (VERSION 2.8) 
PROJECT (Demo) 

if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") 
    # using Visual Studio C++ 
    add_definitions(-DBUILD_DLL) 
    SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} xmllite.lib") 
    string(REGEX REPLACE "/bin/[^/]*$" "" VCINSTALLDIR "${CMAKE_C_COMPILER}") 
    message(STATUS "Guessed MSVC directory: ${VCINSTALLDIR}") 
endif() 

SET(SRCS 
    Demo.cpp 
    stdafx.cpp 
) 

ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS}) 
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PUBLIC ../../Include) 
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}../../build/x64/DebugStatic/mylibA_static.lib ${CMAKE_CURRENT_SOURCE_DIR}../../build/x64/DebugStatic/mylibB_static.lib) 

diese Logik verwenden, würde nicht CMake ein Visual Studio C++ Projekt bauen genannt Demo.vcproj ... und innerhalb dieser Projektdatei würde verknüpft zwei Bibliotheken mylibA_static genannt .lib und mylibB_static.lib innerhalb der Referenzen. Wenn ich dies jedoch versuche, bekomme ich nie irgendeine Art von verknüpfter Bibliothek.

+0

Haben Sie dieses generierte Projekt erstellt? Das von Ihnen bereitgestellte Skript generiert es nur. – arrowd

+0

Was meinst du? Habe ich mylibA_static.lib und mylibB_static.lib erstellt? Ja, ich habe auch den Quellcode für diese Bibliotheken ... aber ich dachte, da ich die kompilierten Bibliotheken bereits als .lib-Dateien habe ... Ich dachte, es wäre viel einfacher, wenn ich diese einfach in das Demo-Projekt einbinden könnte. Ist das möglich? Oder sagst du, ich sollte das Demo-Projekt "bauen"? Wenn ja, wie mache ich das mit CMake? Denn wenn ich das generierte .vcproj-Demoprojekt öffne, sehe ich keine Bibliotheken, die im Projekt verlinkt sind. – andyopayne

+0

Der Versuch, das generierte Demo-Projekt zu erstellen, schlägt fehl. Es sagt nicht unbedingt, warum es scheitert, aber ich weiß, dass es die Bibliotheken im Verweisebereich des Projekts verlinken sollte ... und diese sind nicht vorhanden, also stelle ich mir vor, dass die Bibliotheken richtig verlinkt sind. – andyopayne

Antwort

0

Erstens, in Ihrem Batch-Skript haben Sie nur die Makefiles generiert, aber Sie haben die Bibliothek nicht erstellt. Daher würde ich vorschlagen, dass Sie die Zeile make nach cmake und vor cd hinzufügen.

Zweitens würde ich vorschlagen, dass Sie alle Ihre Zeichenfolgen mit doppelten Anführungszeichen umgeben, um spezifisch zu sein und Verwechslungen zwischen constants und variables zu vermeiden. Außerdem ist es besser, zusätzliche Schrägstriche hinzuzufügen. So ändern

TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}../../build/x64/DebugStatic/mylibA_static.lib ${CMAKE_CURRENT_SOURCE_DIR}../../build/x64/DebugStatic/mylibB_static.lib)

zu

TARGET_LINK_LIBRARIES(${PROJECT_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/../../build/x64/DebugStatic/mylibA_static.lib" "${CMAKE_CURRENT_SOURCE_DIR}/../../build/x64/DebugStatic/mylibB_static.lib)".

Wie für die relativen Pfade, denke ich, dass es dir gut geht. Aber seien Sie vorsichtig, wenn Sie CMAKE_SOURCE_DIR und CMAKE_CURRENT_SOURCE_DIR verwenden. Hier sind einige Hinweise aus CMake Wiki:

CMAKE_CURRENT_SOURCE_DIR dies das Verzeichnis, in dem die aktuell verarbeitet CMakeLists.txt in

CMAKE_SOURCE_DIR dieser befindet, ist das Verzeichnis, das die Top-Level enthält CMakeLists.txt, dh das Quellverzeichnis der obersten Ebene

+0

Hmm. Nun, wenn ich alle meine Pfade so ändere, dass sie Zitate enthalten und dann das Batch-Skript ausführen ... gibt es nur eine .sln-Datei aus, aber nicht die .vcxproj-Datei. Wenn ich versuche, das Projekt zu öffnen, wird es nicht geladen. Außerdem habe ich die Zeile 'make' nach der Cmake-Zeile hinzugefügt, aber es scheint nichts zu tun (das kann ich sagen). Gibt es Parameter, die ich vermisse? – andyopayne

+0

OK, fügen Sie dann 'rm -rf% builddir%' vor der Zeile 'falls nicht vorhanden% builddir% (mkdir% builddir%)' hinzu. Im Grunde wird dies Ihre alten Makefiles löschen und mit einem sauberen Build-Ordner neu beginnen. –

+0

'rm' scheint kein gültiger Befehl zu sein. siehe https://stackoverflow.com/questions/6585477/what-does-this-command-mean-in-batch. Plus, würde dieser Befehl nicht einfach den Build-Ordner löschen, wenn er existiert (der dann in der nächsten Zeile neu erstellt wird). Wie würde das helfen, die .vcxproj Datei zu regenerieren? – andyopayne

Verwandte Themen