CMake没有链接库文件

问题描述:

我有一个批处理脚本,运行时只需调用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

首先,在您的批处理脚本中,您只生成了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://*.com/questions/6585477/what-does-this-command-mean-in-batch。另外,如果它存在的话(那么它会在下一行中重新创建)不会简单地删除构建文件夹。这将如何帮助重新生成.vcxproj文件? – andyopayne