使用其他目录中的库构建项目。 Windows, MinGW
Build project with libraries in other directories. Windows, MinGW
我几乎没有别人产品的库,我的库也很少(dll 和 headers)。
为了更好地构建我的项目(并且只是为了增加我的知识),我想将 dll 放在其他目录中(不是带有 exe 的目录)。
据我所知,Windows 仅在 exedir 和 sysdir 中使用 dll(寻找 exe 的 dll)。
此外,存在可以帮助我的注册码,但它是作为 PATH var.
的全球解决方案
1.我可以 link exe 和一些 dll,它放在关于 exe 的较低层次的目录中吗?怎么样?
此外,我想用于此 MinGW。
我找不到关于我的问题的足够信息,我找到了 linker 的 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
但我仍然可以 运行 只有当 dll 放在 exedir 中时才不会出错。
所以,我找到了 -Wl,-rpath,...
的 arg(?) $ORIGIN
,据我所知,它是某个 obj 文件的 workdir 的完整路径吗?还是不行?
3。什么是 $ORIGIN? Should\Can我用它来解决我的问题?
对不起我的英语。提前谢谢你。
- Can I link exe with some dll, which placed in dir on lower hierarchy about exe? How?
没有。不幸的是,你不能。默认情况下,Windows DLL 搜索路径顺序为 as follows:
- 加载应用程序的目录。
- 系统目录。使用GetSystemDirectory函数获取该目录的路径。
- 16位系统目录。没有获取这个目录路径的函数,但是搜索到了。
- Windows目录。使用 GetWindowsDirectory 函数获取此目录的路径。
- 当前目录。
- PATH 环境变量中列出的目录。
因此,如果您不能将 DLL 放在这些目录之一中,那么自动动态加载将看不到它们。 但是,一个可能的替代方法是在启动 EXE 之前在本地设置 PATH
。例如,附加到 PATH
的 BAT 文件然后启动该程序,或者您编写的另一个执行相同操作的程序。
-Wl,-rpath-link,...; -Wl,-rpath,...;
- Can I use this keys to solve my problem on Windows with MinGW? How?
没有。这些不适用于 MinGW,将被忽略。 Windows 上没有等效项。与 ELF 二进制文件(例如 Linux)不同,EXE 不支持指定额外的运行时搜索路径。有关详细信息,请参阅 Linking with -R and -rpath switches on Windows and Is there a Windows/MSVC equivalent to the -rpath linker flag?。
- What is $ORIGIN? Should\Can I use it to solve my problem?
没有。 $ORIGIN
只是一个特殊的标记,本质上只是表示 "the path where this application is located"。来自 the man page for ld
:
$ORIGIN (or equivalently ${ORIGIN})
This expands to the directory containing the program or shared
object. ...
因为 -rpath
对 Windows 不起作用,所以这与这里无关。
因此您必须将 DLL 放在它们的预期位置,或者通过批处理文件或其他先设置 PATH
的程序启动可执行文件。
顺便说一句,如果可以,请不要向 system/user-wide PATH
变量添加任何内容。我知道这很诱人,许多应用程序都这样做,但是 PATH
的污染对用户来说成为一个问题,尤其是当安装了很多具有相同 DLLs/EXEs 版本冲突的应用程序时。
我几乎没有别人产品的库,我的库也很少(dll 和 headers)。 为了更好地构建我的项目(并且只是为了增加我的知识),我想将 dll 放在其他目录中(不是带有 exe 的目录)。
据我所知,Windows 仅在 exedir 和 sysdir 中使用 dll(寻找 exe 的 dll)。 此外,存在可以帮助我的注册码,但它是作为 PATH var.
的全球解决方案1.我可以 link exe 和一些 dll,它放在关于 exe 的较低层次的目录中吗?怎么样?
此外,我想用于此 MinGW。
我找不到关于我的问题的足够信息,我找到了 linker 的 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
但我仍然可以 运行 只有当 dll 放在 exedir 中时才不会出错。
所以,我找到了 -Wl,-rpath,...
的 arg(?) $ORIGIN
,据我所知,它是某个 obj 文件的 workdir 的完整路径吗?还是不行?
3。什么是 $ORIGIN? Should\Can我用它来解决我的问题?
对不起我的英语。提前谢谢你。
- Can I link exe with some dll, which placed in dir on lower hierarchy about exe? How?
没有。不幸的是,你不能。默认情况下,Windows DLL 搜索路径顺序为 as follows:
- 加载应用程序的目录。
- 系统目录。使用GetSystemDirectory函数获取该目录的路径。
- 16位系统目录。没有获取这个目录路径的函数,但是搜索到了。
- Windows目录。使用 GetWindowsDirectory 函数获取此目录的路径。
- 当前目录。
- PATH 环境变量中列出的目录。
因此,如果您不能将 DLL 放在这些目录之一中,那么自动动态加载将看不到它们。 但是,一个可能的替代方法是在启动 EXE 之前在本地设置 PATH
。例如,附加到 PATH
的 BAT 文件然后启动该程序,或者您编写的另一个执行相同操作的程序。
-Wl,-rpath-link,...; -Wl,-rpath,...;
- Can I use this keys to solve my problem on Windows with MinGW? How?
没有。这些不适用于 MinGW,将被忽略。 Windows 上没有等效项。与 ELF 二进制文件(例如 Linux)不同,EXE 不支持指定额外的运行时搜索路径。有关详细信息,请参阅 Linking with -R and -rpath switches on Windows and Is there a Windows/MSVC equivalent to the -rpath linker flag?。
- What is $ORIGIN? Should\Can I use it to solve my problem?
没有。 $ORIGIN
只是一个特殊的标记,本质上只是表示 "the path where this application is located"。来自 the man page for ld
:
$ORIGIN (or equivalently ${ORIGIN}) This expands to the directory containing the program or shared object. ...
因为 -rpath
对 Windows 不起作用,所以这与这里无关。
因此您必须将 DLL 放在它们的预期位置,或者通过批处理文件或其他先设置 PATH
的程序启动可执行文件。
顺便说一句,如果可以,请不要向 system/user-wide PATH
变量添加任何内容。我知道这很诱人,许多应用程序都这样做,但是 PATH
的污染对用户来说成为一个问题,尤其是当安装了很多具有相同 DLLs/EXEs 版本冲突的应用程序时。