2017-06-29 85 views
0

我有一個批處理腳本,運行時只需調用cmake命令來構建Visual Studio C++項目。然而,該項目應該有兩個引用兩個靜態庫...但是,無論我嘗試什麼,我似乎無法讓我的項目正確鏈接庫。這裏是我的文件夾結構的外觀:CMake沒有鏈接庫文件

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

現在,我從演示項目文件夾結構中的cmake的文件夾中運行批處理腳本。我的批處理腳本如下:

@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% 

沒什麼太複雜的。現在,讓我們來看看的CMakeLists.txt文件:

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) 

使用這個邏輯,豈不CMake的構建一個Visual Studio C++項目稱爲Demo.vcproj ......和項目文件中會鏈接兩個庫稱爲mylibA_static .lib和mylibB_static.lib在引用中。然而,當我嘗試這個時,我從來沒有得到任何類型的鏈接庫。

+0

您是否構建了生成的項目?您提供的腳本僅生成它。 – arrowd

+0

你是什麼意思?我建立了mylibA_static.lib和mylibB_static.lib嗎?是的,我也有這些庫的源代碼...但是我想,因爲我已經將編譯過的庫作爲.lib文件了......我想如果我可以簡單地將這些文件鏈接到Demo項目中,情況會更加簡單。那可能嗎?還是你說我應該'建立'Demo項目?如果是這樣,我該如何使用CMake來做到這一點?因爲當我打開生成的.vcproj演示項目時,我看不到任何項目中鏈接的庫。 – andyopayne

+0

試圖構建生成的演示項目失敗。它不一定說它爲什麼會失敗,但我知道它應該鏈接項目的引用部分中的庫......並且這些庫不存在,所以我想這是因爲這些庫已正確鏈接。 – andyopayne

回答

0

首先,在您的批處理腳本中,您只生成了makefile,但實際上並沒有生成庫。所以我建議你在cmake之後和cd之前加上make這一行。其次,我建議你用雙引號括住所有的字符串,以便具體說明,並避免constantsvariables之間的混淆。另外,最好添加額外的斜線。因此,改變

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)

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

至於相對路徑,我認爲你很好。但在使用CMAKE_SOURCE_DIRCMAKE_CURRENT_SOURCE_DIR時要小心。下面是一些筆記CMake Wiki

CMAKE_CURRENT_SOURCE_DIR這就是當前 處理的CMakeLists.txt位於

CMAKE_SOURCE_DIR這個目錄包含頂級 的CMakeLists.txt,即目錄頂級源代碼目錄

+0

嗯。那麼,當我將所有路徑更改爲包含引號並運行批處理腳本時...現在只輸出.sln文件,而不是.vcxproj文件。所以,當我嘗試打開該項目時,它無法加載。另外,我在cmake行後面添加了'make'行,但它並沒有實際做任何事情(我可以​​說)。我缺少參數嗎? – andyopayne

+0

好的,那麼,在行'如果不存在%builddir%(mkdir%builddir%)'''之前加'rm -rf%builddir%'。基本上,這會刪除舊的makefile,並從乾淨的'build'文件夾重新開始。 –

+0

'rm'似乎不是一個有效的命令。請參閱https://stackoverflow.com/questions/6585477/what-does-this-command-mean-in-batch。另外,如果它存在的話(那麼它會在下一行中重新創建)不會簡單地刪除構建文件夾。這將如何幫助重新生成.vcxproj文件? – andyopayne