不要链接库文件

时间:2017-06-29 18:44:27

标签: c++ batch-file cmake

我有一个批处理脚本,在运行时只需调用一个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的库。但是,当我尝试这个时,我从来没有得到任何类型的链接库。

1 个答案:

答案 0 :(得分:0)

首先,在批处理脚本中,您只生成了makefile,但实际上并没有构建库。因此,我建议您在make之后和cmake之前添加第cd行。

其次,我建议您使用双引号括住所有字符串,以便具体,并避免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,即顶级源目录