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在引用中。然而,当我尝试这个时,我从来没有得到任何类型的链接库。
首先,在您的批处理脚本中,您只生成了makefile,但实际上并没有生成库。所以我建议你在cmake
之后和cd
之前加上make
这一行。其次,我建议你用双引号括住所有的字符串,以便具体说明,并避免constants
和variables
之间的混淆。另外,最好添加额外的斜线。因此,改变
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_DIR
和CMAKE_CURRENT_SOURCE_DIR
时要小心。下面是一些笔记CMake Wiki:
CMAKE_CURRENT_SOURCE_DIR这就是当前 处理的CMakeLists.txt位于
CMAKE_SOURCE_DIR这个目录包含* 的CMakeLists.txt,即目录*源代码目录
嗯。那么,当我将所有路径更改为包含引号并运行批处理脚本时...现在只输出.sln文件,而不是.vcxproj文件。所以,当我尝试打开该项目时,它无法加载。另外,我在cmake行后面添加了'make'行,但它并没有实际做任何事情(我可以说)。我缺少参数吗? – andyopayne
好的,那么,在行'如果不存在%builddir%(mkdir%builddir%)'''之前加'rm -rf%builddir%'。基本上,这会删除旧的makefile,并从干净的'build'文件夹重新开始。 –
'rm'似乎不是一个有效的命令。请参阅https://*.com/questions/6585477/what-does-this-command-mean-in-batch。另外,如果它存在的话(那么它会在下一行中重新创建)不会简单地删除构建文件夹。这将如何帮助重新生成.vcxproj文件? – andyopayne
您是否构建了生成的项目?您提供的脚本仅生成它。 – arrowd
你是什么意思?我建立了mylibA_static.lib和mylibB_static.lib吗?是的,我也有这些库的源代码...但是我想,因为我已经将编译过的库作为.lib文件了......我想如果我可以简单地将这些文件链接到Demo项目中,情况会更加简单。那可能吗?还是你说我应该'建立'Demo项目?如果是这样,我该如何使用CMake来做到这一点?因为当我打开生成的.vcproj演示项目时,我看不到任何项目中链接的库。 – andyopayne
试图构建生成的演示项目失败。它不一定说它为什么会失败,但我知道它应该链接项目的引用部分中的库......并且这些库不存在,所以我想这是因为这些库已正确链接。 – andyopayne