假设我使用cmake创建这样的项目:
${root}/lib/CMakeLists.txt
add_library(FooLib SHARED ${SOURCES})
${root}/main/CMakeLists.txt
add_executable(Main main.cpp)
target_link_libraries(Main FooLib)
现在,如果我在linux上运行Main(在我的情况下是fedora),它将自动加载FooLib.so。但是在Windows上,Main.exe会抱怨找不到FooLib.dll。如果我复制FooLib.dll或手动指定PATH,Main.exe也可以正常工作。
我的问题是,这是因为Windows上的lib& dll工作流程吗?
有没有什么方法可以让Main.exe像Linux一样记住FooLib库的路径?
答案 0 :(得分:-1)
如果静态或动态地将可执行文件与lib链接,则相应的dll需要与exe位于同一文件夹中。这是Windows应用程序的标准设计。主要原因是在加载dll时,包含导出函数引用的exe(这是由lib提供)调用驻留在dll中的这些函数的实现。
您可以将您的dll放在system32文件夹中,该文件夹通常位于C:\ Program文件或c:\ windows文件夹中,具体取决于操作系统类型32/64位等,因为这些被定义为Windows中的系统环境路径/变量。 / p>
将始终优先考虑exe驻留路径,然后是上述路径。请确保在system32中没有类似文件夹的重复项,因为exe可能会加载这些dll的函数。