使用其他目录中的库构建项目。 Windows,MinGW

时间:2017-02-27 23:59:59

标签: c++ windows gcc dll mingw

我的其他人的产品库很少,而我的库(dll和header)很少。 为了更好地构建我的项目(并且只是为了增加我的知识),我想将dll放在其他目录中(而不是带有exe的dir)。

据我所知,Windows仅在exedir和sysdir中使用dll(看dlls for exe)。 此外,存在可以帮助我的regkeys,但它是PATH var。

的全局解决方案

1。我可以将exe链接到一些dll,它放在dir中关于exe的较低层次结构吗?怎么样?

另外,我想用这个MinGW。

我发现关于我的问题没有足够的信息,我找到了链接器的g ++密钥:
-Wl,-rpath-link,...; -Wl,-rpath,...;

2。我可以使用此密钥在MinGW的Windows上解决我的问题吗?怎么样?

我试过这个:
g++ -Wl,-rpath-link,.\out\lib\ -Wl,-rpath,.\lib\ -L .\out\lib\ -l:foolib.dll main.o -o out\main.exe
但是我仍然可以在没有错误的情况下运行exe,只有当dll放在exedir中时。

所以,我发现$ORIGIN的arg(?)-Wl,-rpath,...正如我所理解的那样,是某个obj文件的workdir的完整路径?或者不是?

第3。什么是$ ORIGIN?应该\我可以用它来解决我的问题吗?

抱歉我的英文。提前谢谢。

1 个答案:

答案 0 :(得分:1)

  
      
  1. 我可以将exe链接到一些dll,这些dll放在关于exe的低层次的dir中吗?怎么样?
  2.   

没有。不幸的是,你不能。默认情况下,Windows DLL搜索路径顺序为as follows

  1. 加载应用程序的目录。
  2. 系统目录。使用GetSystemDirectory函数获取此目录的路径。
  3. 16位系统目录。没有函数可以获取此目录的路径,但会搜索它。
  4. Windows目录。使用GetWindowsDirectory函数获取此目录的路径。
  5. 当前目录。
  6. PATH环境变量中列出的目录。
  7. 因此,如果您无法将DLL放在其中一个目录中,则自动动态加载将无法看到它们。 但是,可能的替代方法是在启动EXE之前在本地设置PATH。例如,附加到PATH的BAT文件然后启动该程序,或者您编写的另一个程序也会执行该程序。

      

    -Wl,-rpath链路,...; -Wl,-rpath,...;

         
        
    1. 我可以使用此键在MinGW的Windows上解决我的问题吗?怎么样?
    2.   

    没有。这些不适用于MinGW,只会被忽略。在Windows上没有等效的东西。与ELF二进制文件(例如Linux)不同,EXE不支持额外的运行时搜索路径的规范。有关详细信息,请参阅Linking with -R and -rpath switches on WindowsIs there a Windows/MSVC equivalent to the -rpath linker flag?

      
        
    1. $ ORIGIN是什么?应该\我可以用它来解决我的问题吗?
    2.   

    没有。 $ORIGIN只是一个特殊的标记,它基本上只表示该应用程序所在的路径"。来自the man page for ld

      $ORIGIN (or equivalently ${ORIGIN})
              This expands to the directory containing the program or shared
              object.  ...
    

    由于-rpath无法在Windows上运行,因此这与此无关。

    因此,您必须将DLL放在预期的位置,或者通过批处理文件或首先设置PATH的其他程序启动可执行文件。

    顺便说一句,如果您能提供帮助,请不要在系统/用户范围PATH变量中添加任何内容。我知道这很诱人,许多应用程序都这样做,但是PATH的污染成为用户的问题,特别是当安装了许多具有相同DLL / EXE的冲突版本的应用程序时。