我有一个批处理脚本,在运行时只需调用一个cmake命令来构建一个visual studio C ++项目。但是,该项目应该有两个静态库的引用...但是,无论我尝试什么,我似乎无法让我的项目正确链接库。这是我的文件夹结构的外观:
.
+-- build
| +-- x64
| +-- DebugStatic
| +-- mylibA_static.lib
| +-- mylibB_static.lib
+-- Include
+-- Source
+-- myproject
| +-- Demo
| +-- build
| +-- cmake
| +-- GenerateVS2015.bat
| +-- CMakeLists.txt
| +-- Demo.cpp
| +-- stdafx.cpp
现在,我正在Demo项目文件夹结构中的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不会构建一个名为Demo.vcproj的Visual Studio C ++项目......并且在该项目文件中将在引用中链接两个名为mylibA_static.lib和mylibB_static.lib的库。但是,当我尝试这个时,我从来没有得到任何类型的链接库。
答案 0 :(得分:0)
首先,在批处理脚本中,您只生成了makefile,但实际上并没有构建库。因此,我建议您在make
之后和cmake
之前添加第cd
行。
其次,我建议您使用双引号括住所有字符串,以便具体,并避免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,即顶级源目录