微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 使用cmake构建可执行文件和共享库,runtimelinker找不到dll

我正在使用 gcc(cygwin),gnu make,windows 7和cmake.

我的cmake testprojekt具有以下结构

rootdir
|-- App
|   |-- app.cpp
|   +-- CMakeLists.txt
|-- Lib
|   |-- lib.cpp
|   |-- CMakeLists.txt
|-- MakeFileProject
+ CMakeLists.txt

ROOTDIR /应用/ app.cpp:

#include<string>
void printThemmessagetoScreen(std::string input);//prototype
int main(int argc,char **argv){
 printThemmessagetoScreen("this will be displayed by our lib");
 return 0;
}

ROOTDIR /库/ lib.cpp:

#include<iostream>
#include<string>

void printThemmessagetoScreen(std::string input){
 std::cout<<input;
}

ROOTDIR /的CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)
project(TestProject)

add_subdirectory(App)
add_subdirectory(Lib)

ROOTDIR / lib中/的CMakeLists.txt:

add_library(Lib SHARED lib.cpp)

ROOTDIR /应用/的CMakeLists.txt:

# Make sure the compiler can find include files from our Lib library. 
include_directories (${LIB_SOURCE_DIR}/Lib) 

# Make sure the linker can find the Lib library once it is built. 
link_directories (${LIB_BINARY_DIR}/Lib) 

# Add executable called "TestProjectExecutable" that is built from the source files 
add_executable (TestProjectExecutable app.cpp) 

# Link the executable to the lib library. 
target_link_libraries (TestProjectExecutable Lib)

现在,当我运行cmake和make时,一切都将生成并且构建没有错误,但是当我尝试执行二进制文件时,它将失败,因为找不到生成的库.

但是:当我将lib dll复制到像app exe这样的目录时,它会被执行!

另外:如果我将库配置为静态,它也将执行.

如何告诉运行时链接器在哪里查找我的DLL?

更新:

解决方案根据用户Vorren提出的方法

我打开了注册表编辑器,导航到以下密钥:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

,在这里我创建了一个名为applikation的新密钥:

在这种情况下:TestProjectExecutable.exe

之后,(认)值设置为TestProjectExecutable.exe的完整路径,包括文件名和扩展名.然后我创建了另一个名为“Path”的字符串值,并将值设置为dll所在的文件夹:

解决方法

您的问题不在于链接器或编译器,而在于Windows搜索DLL的方式.

操作系统将使用以下算法来定位所需的DLL:

顺便拜访:

>特定于应用程序的Path注册表项中列出的目录;
>当前进程的可执行模块所在的目录;
>当前目录;
> Windows系统目录;
> Windows目录;
> PATH环境变量中列出的目录;

因此,如果您不想使用特定于应用程序的dll来混淆操作系统目录,那么您有两个合理的选择:

>创建一个特定于应用程序的Path注册表项(我会使用此选项);>将您的DLL放在与EXE相同的文件夹中;>修改PATH变量(但是为什么要这样做,如果你可以使用选项1?);

原文地址:https://www.jb51.cc/c/117635.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐