我有三个名为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,一切都会很好。
任何方法让它停止帮助这么多?有人知道另一种方法吗? 谢谢!
答案 0 :(得分:1)
在原始问题中,您询问target_link_libraries
如何使用.dll
文件。 target_link_libraries
需要.lib
。
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 )
这里的关键是使用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中运行INSTALL
项目(或将其设置为启动项目并正确设置调试)。因此,每次您构建INSTALL
项目时,其中的所有二进制文件都会显示在C:\Program Files (x86)\myproj\myproj.exe
如果只在Visual Studio中开发 - 请勿使用CMake。每个工具都需要明智地使用。
答案 1 :(得分:1)
更准确地说,您不能将.dll文件与visual studio编译器(也不是Windows上的任何其他编译器)链接起来。这不是一个cmake问题。你是从哪里获得alpha.dll的?你编译了吗?