Visual studio 2015 如何将目标链接目录添加到cmake中的DLL?

Visual studio 2015 如何将目标链接目录添加到cmake中的DLL?,visual-studio-2015,cmake,Visual Studio 2015,Cmake,我有3个dll,它们的名称分别是debug/alpha.dll、release/alpha.dll和relwithdebinfo/alpha.dll 我想让cmake这样做: target_link_libraries(${PROJECT_NAME} debug ../adir/debug/alpha.dll) target_link_libraries(${PROJECT_NAME} relwithdebinfo ../adir/relwithdebug/alpha.dll) target_l

我有3个dll,它们的名称分别是debug/alpha.dll、release/alpha.dll和relwithdebinfo/alpha.dll

我想让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} release ../adir/release/alpha.dll)
我认为这将根据visual studio 2015中指定的配置添加这三个不同的dll

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

Error   LNK1104 cannot open file '../adir/debug/alpha.lib'  
问:我如何让它用DLL代替它放在那里的LIB,我只想让它停止假设LIB,并实际听我放的东西,.DLL和所有东西都会工作得很好

有没有办法让它停止帮这么多忙?有人知道另一种方法吗?
谢谢

在您最初的问题中,您询问了如何使用
.dll
文件
链接库<代码>目标链接库
需要一个
.lib

棘手的、棘手的、甚至不可能的解决方案 您可以使用任何(
${CMAKE\u BINARY\u DIR}
)来指定
.lib
文件路径。此外,您需要
添加依赖项(myproj mylib)
,以确保在生成
.lib
.dll
文件之前不会链接
.exe
文件。 此外,要使用Visual Studio运行输出项目,您需要将
.dll
.exe
文件都放在同一文件夹中,默认情况下CMake不提供这一功能。有一个像下面这样的黑客功能,可以为所有输出文件设置一个且唯一的目录(如果您想支持不同的版本,您需要修改它-我是说debug/release/etc…-但我不确定这是否可行)

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 .)
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/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 .)
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;
}
#包括“mylib/mylib.hpp”
#包括
int main(int argc,char*argv[]){
printf(“%d\n”,mysum(5,6));
返回0;
}
BUILD\u SHARED\u LIBS
设置为
TRUE
时,您将构建
SHARED
库,设置为
FALSE
时,您将构建
静态
库。 这个解决方案的棘手之处在于您需要

  • 手动创建
    C:\ProgramFiles(x86)\myproj
    文件夹并在其下进行完全控制(请参阅鼠标右键单击->属性->安全选项卡)
  • 设置为运行
    C:\ProgramFiles(x86)\myproj\myproj.exe
    文件以在Visual Studio中运行
  • 在Visual Studio中编译
    安装
    项目(或将其设置为启动项目并正确设置调试)
因此,每次构建
INSTALL
project时,其中的所有二进制文件都将出现在
C:\ProgramFiles(x86)\myproj\myproj.exe

最推荐的解决方案
如果您仅在Visual Studio中开发-请不要使用CMake。每个工具都需要明智地使用。

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

我如何让它用DLL代替它放在那里的库,我只想让它停止假设库,真正听我放的东西,.DLL,一切都会很好。为什么要链接到DLL?使用dll,您可以链接到具有
.lib
扩展名的导入库,而不是dll本身。我不能是唯一拥有两个项目的人,一个项目生成dll,一个项目生成依赖于该dll的exe…并希望在调试模式下运行。我是说,就是这样!我只想在发布或调试中运行我的exe,并在运行时使用正确的dll,我是世界上唯一一个想要如此复杂的东西的人吗???我不能是唯一有两个项目的人,一个是制作dll,一个是制作依赖于该dll的exe。。你不是。我在VisualStudio和CMake中一直使用DLL。如果使用适当的
\uu declspec(dllexport)
从dill中导出符号(通常由宏完成,因为对于使用dll的代码,需要将其更改为
\uu declspec(dllimport)
),将创建导入库。你链接到它,在运行时dll将被加载(前提是它在搜索路径中)。好的,不是链接,很明显,动态有一个含义…它是dll动态链接库,所以是的,它们最终是动态链接的。。。dll是由我的一个项目生成的,主exe显然需要引用正确构建的dll版本,调试/发布取决于。因此,我希望VS在运行我的主exe时能够找到dll的正确版本…我希望这是明确的。您要做的是将库构建为静态库,或者在构建dll时生成导入库(请参阅)。您还可以使用cmake提供的新机制(请参阅)。我自己没有试过,所以我不知道它有多有效链接缺少linux/unix支持。告诉我如果你需要它,我不能是唯一一个有两个项目的人,一个生成DLL,一个生成依赖于该DLL的exe…并希望在调试模式下运行。我是说,就是这样!我只想在发布版或调试版中运行我的exe,并在运行时使用正确的dll,难道世界上只有我一个人想要如此复杂的东西吗?@user2016641因为误解,我自己尝试了3种方法来解决这个问题。