如何在cmake中将target_link_directories添加到dll?

时间:2016-07-20 22:44:40

标签: visual-studio-2015 cmake

我有三个名为debug / alpha.dll,发布/ alpha.dll和relwithdebinfo / alpha.dll

的dll&#39

我想让cmake这样做:

target_link_libraries($ {PROJECT_NAME} debug ../adir/debug/alpha.dll) target_link_libraries($ {PROJECT_NAME} relwithdebinfo ../adir/relwithdebug/alpha.dll) target_link_libraries($ {PROJECT_NAME}发布../ adir / release / alpha.dll)

根据visual studio 2015中指定的配置,我认为会添加这三个不同的dll。

它几乎可以工作,它会尝试加载

错误LNK1104无法打开文件' ../ adir / debug / alpha.lib'

问题:我如何让它替换它放在那里的LIB的DLL,我只是想让它停止假设lib,并实际听取我放的东西,.dll,一切都会很好。

任何方法让它停止帮助这么多?有人知道另一种方法吗? 谢谢!

2 个答案:

答案 0 :(得分:1)

在原始问题中,您询问target_link_libraries如何使用.dll文件。 target_link_libraries需要.lib

Hacky,棘手且可能不可能的解决方案

SET(ENGINE_LIBRARY optimized "${CMAKE_CURRENT_SOURCE_DIR}/../mylib.lib" debug "${CMAKE_CURRENT_SOURCE_DIR}/../mylib_d.lib")
target_link_libraries(${PROJECT_NAME} ${ENGINE_LIBRARY})

您可以使用CMake useful variables中的任何一个(例如${CMAKE_BINARY_DIR})来指定.lib文件路径。此外,您需要add_dependencies(myproj mylib)确保在生成.exe.lib文件之前不会链接.dll文件。 此外,要使用Visual Studio运行输出项目,您需要将.dll.exe文件放在同一文件夹中,并且CMake默认情况下不提供此项。有一个像下面这样的hacky函数来设置所有输出文件的唯一目录(如果你想支持不同的构建,你需要修改它 - 我的意思是调试/发布/等... - 但我不确定这是可能的。)

#set output directory for all subprojects

set (outputdirectory "../../../__test_environment")
# First for the generic no-config case (e.g. with mingw)
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${outputdirectory} )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${outputdirectory} )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${outputdirectory} )
# Second, for multi-config builds (e.g. msvc)
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
    string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
    set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${outputdirectory} )
    set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${outputdirectory} )
    set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${outputdirectory} )
endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )

CMake提供开箱即用的解决方案(推荐)

这里的关键是使用install CMake语句。

让我们检查具有此文件夹结构的示例项目

mylib/CMakeLists.txt
mylib/mylib.cpp
mylib/mylib.hpp
CMakeLists.txt
myproj.cpp

的CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

project(myproj)

set(BUILD_SHARED_LIBS TRUE)

if (BUILD_SHARED_LIBS)
    add_definitions(-D MYPROJ_DLL)
endif()

add_subdirectory(mylib)

set(HEADERS
    mylib/mylib.hpp
)

set(SOURCES
    myproj.cpp
)

add_executable(${PROJECT_NAME} ${HEADERS} ${SOURCES})
target_link_libraries(${PROJECT_NAME} mylib)

install(TARGETS ${PROJECT_NAME} DESTINATION .)

MYLIB /的CMakeLists.txt

project(mylib)

set(HEADERS
    mylib.hpp
)

set(SOURCES
    mylib.cpp
)

add_library(${PROJECT_NAME} ${HEADERS} ${SOURCES})

if (BUILD_SHARED_LIBS)
    install(TARGETS ${PROJECT_NAME} DESTINATION .)
endif()

MYLIB / mylib.cpp

#include "mylib.hpp"

int MYLIB_API mysum(int a, int b) {
    return a + b;
}

MYLIB / mylib.hpp

#pragma once

#ifdef MYPROJ_DLL
#   ifdef _WINDLL
#       define MYLIB_API __declspec(dllexport)
#   else
#       define MYLIB_API __declspec(dllimport)
#   endif
#else
#   define MYLIB_API
#endif

int MYLIB_API mysum(int a, int b);

myproj.cpp

#include "mylib/mylib.hpp"
#include <stdio.h>

int main(int argc, char* argv[]) {
    printf("%d\n", mysum(5, 6));
    return 0;
}

BUILD_SHARED_LIBS设置为TRUE,您将构建SHARED个库,并将其设置为FALSE,您将构建STATIC个库。 关于这个解决方案的棘手问题是你需要

  • 手动创建C:\Program Files (x86)\myproj文件夹并在其下方给予您完全控制(请参阅鼠标右键单击 - &gt;属性 - &gt;安全性标签页)
  • 设置为运行C:\Program Files (x86)\myproj\myproj.exe文件以在Visual Studio中运行
  • 在Visual Studio中编译INSTALL项目(或将其设置为启动项目并正确设置调试)。

因此,每次您构建INSTALL项目时,其中的所有二进制文件都会显示在C:\Program Files (x86)\myproj\myproj.exe

最推荐的解决方案

如果只在Visual Studio中开发 - 请勿使用CMake。每个工具都需要明智地使用。

答案 1 :(得分:1)

更准确地说,您不能将.dll文件与visual studio编译器(也不是Windows上的任何其他编译器)链接起来。这不是一个cmake问题。你是从哪里获得alpha.dll的?你编译了吗?