标签: static-linking

与MinGW的静态和动态/共享链接

我想从一个简单的链接用法开始解释我的问题.让我们假设有一个库z可以编译为共享库libz.dll(D:/libs/z/shared/libz.dll)或静态库libz.a(D:/ libs/z/static/libz.一个).

让我想链接它,然后我这样做:

gcc -o main.exe main.o -LD:/libs/z/static -lz
Run Code Online (Sandbox Code Playgroud)

根据这个文档,gcc将搜索libz.a,即

归档文件,其成员是目标文件

我也可以做以下事情:

gcc -o main.exe main.o -LD:/libs/z/shared -lz
Run Code Online (Sandbox Code Playgroud)

在上面的文档中没有提到-l标志将搜索lib<name>.so.

如果我libz.a和libz.dll将在同一目录中会发生什么?图书馆如何与计划挂钩?为什么我需要标志-Wl,-Bstatic,-Wl,-Bdynamic如果-l搜索共享和静态库?

如果我编译共享库分发,为什么有些开发人员为.a文件提供相同模块的.dll文件?

例如,Qt在bin目录中提供.dll文件,其中包含lib目录中的.a文件.它是同一个库,但分别构建为共享和静态?或.a文件是某种虚拟库,提供与共享库的链接,其中有真正的库实现?

另一个例子是Windows上的OpenGL库.为什么每个编译器都必须在MingW中提供类似libopengl32.a的静态OpenGL库?

什么是.dll.a和.la扩展名用于的文件?

PS这里有很多问题,但我认为每个问题都取决于前一个问题,没有必要将它们分成几个问题.

c++ gcc mingw dynamic-linking static-linking

28
推荐指数
1
解决办法
4万
查看次数

CMake和静态链接

我在一个项目中使用CMake,我正试图静态链接一些库.我已经设定:

set(BUILD_SHARED_LIBS OFF)
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")
set_target_properties(icarus PROPERTIES LINK_SEARCH_END_STATIC 1)
Run Code Online (Sandbox Code Playgroud)

我确定在寻找具有*.a版本的实际库时.

目前该项目进口:

libPocoNet.a 
libPocoUtil.a 
libPocoXML.a 
libPocoFoundation.a 
libmysqlclient.a 
libmysqlpp.a 
libcrypto++.a 
CUDA
Run Code Online (Sandbox Code Playgroud)

找到所有库,并且在进行动态/共享链接时,它们工作正常.我也试过设置编译标志:

set(GCC_CXX_FLAGS ${GCC_CXX_FLAGS} "-static-libgcc -static-libstdc++ -static")
Run Code Online (Sandbox Code Playgroud)

但无济于事.虽然我在编译时没有遇到任何问题,但链接会为上面库中的调用抛出大量未定义的引用错误,即:

undefined reference to `mysql_thread_init'
undefined reference to `mysql_real_query'
undefined reference to `pthread_mutex_unlock'
undefined reference to `Poco::ErrorHandler::handle()'
Run Code Online (Sandbox Code Playgroud)

不是那个特定的顺序,每个库都有很多错误.

看看海湾合作委员会的最后一行,我看到:

/usr/bin/c++   -g -g  -static-libgcc -static-libstdc++ -static [list of *.cpp files]
-o icarus -rdynamic /usr/local/lib/libPocoFoundation.a /usr/local/lib/libPocoNet.a
/usr/local/lib/libPocoUtil.a /usr/local/lib/libPocoXML.a 
-Wl,-Bstatic -lmysqlclient -lmysqlpp -lcrypto++
Run Code Online (Sandbox Code Playgroud)

这让我想知道:

  1. 为什么Poco库链接为-rdynamic,并且没有-Wl -Bstatic标志?好像它们被跳过/排除在静态链接之外.
  2. 似乎是为静态链接设置了mysqlclient,mysqlpp和crypto ++,但我仍然遇到错误

那么,有人可以向我解释一下:

  1. 如何使用CMake设置部分静态链接
  2. CMAKE_EXE_LINKER_FLAGS是我唯一需要设置的吗?
  3. 我是否应该强制提到的库的静态链接,而不是整个项目?

如果那些问题太多或过于局部化,请原谅我,我之前没有尝试过,而且我似乎无法在网上找到太多信息.

linker gcc cmake static-libraries static-linking

28
推荐指数
2
解决办法
8万
查看次数

有没有办法确定使用哪个版本的Visual Studio来编译静态库?

我有一组静态库(.lib)文件,其中一个文件可能是使用不同版本的Visual Studio构建的.这导致链接所有这些项目的项目的代码生成失败.有没有办法确定使用哪个版本的Visual Studio来编译静态库?

static-libraries static-linking visual-studio

27
推荐指数
3
解决办法
2万
查看次数

如何将Haskell编译为静态库?

嘿,我正在学习Haskell,我有兴趣用它来制作静态库,可以在Python和C中使用.经过一些谷歌搜索我发现如何让GHC输出一个共享对象,但它动态地依赖于GHC`的图书馆.在GHC中编译得到的ELF是动态依赖的,并且只依赖于C libs,并且它的大小在MB之下 - 它与GHC的libs静态链接.如何以及是否可以实现共享对象?

当前状态示例:

$ ghc --make -dynamic -shared -fPIC foo.hs -o libfoo.so
$ ldd libfoo.so
    linux-vdso.so.1 =>  (0x00007fff125ff000)
    libHSbase-4.2.0.2-ghc6.12.3.so => /usr/lib/ghc-6.12.3/base-4.2.0.2/libHSbase-4.2.0.2-ghc6.12.3.so (0x00007f7d5fcbe000)
    libHSinteger-gmp-0.2.0.1-ghc6.12.3.so => /usr/lib/ghc-6.12.3/integer-gmp-0.2.0.1/libHSinteger-gmp-0.2.0.1-ghc6.12.3.so (0x00007f7d5faac000)
    libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007f7d5f816000)
    libHSghc-prim-0.2.0.0-ghc6.12.3.so => /usr/lib/ghc-6.12.3/ghc-prim-0.2.0.0/libHSghc-prim-0.2.0.0-ghc6.12.3.so (0x00007f7d5f591000)
    libHSffi-ghc6.12.3.so => /usr/lib/ghc-6.12.3/libHSffi-ghc6.12.3.so (0x00007f7d5f383000)
    libc.so.6 => /lib/libc.so.6 (0x00007f7d5f022000)
    /lib/ld-linux-x86-64.so.2 (0x00007f7d60661000)

$ ghc foo.hs
$ ldd foo
    linux-vdso.so.1 =>  (0x00007fff2d3ff000)
    libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007f50014ec000)
    libm.so.6 => /lib/libm.so.6 (0x00007f5001269000)
    librt.so.1 => /lib/librt.so.1 (0x00007f5001061000)
    libdl.so.2 => /lib/libdl.so.2 (0x00007f5000e5d000)
    libc.so.6 => /lib/libc.so.6 (0x00007f5000afc000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x00007f50008df000)
    /lib/ld-linux-x86-64.so.2 …
Run Code Online (Sandbox Code Playgroud)

haskell static-libraries ghc static-linking

27
推荐指数
1
解决办法
6147
查看次数

将Yesod部署到Heroku,无法静态构建

我是Yesod的新手,我无法静态构建Yesod,因此我可以部署到Heroku.

我更改了默认的.cabal文件以反映静态编译

if flag(production)
   cpp-options:   -DPRODUCTION
   ghc-options:   -Wall -threaded -O2 -static -optl-static
else
   ghc-options:   -Wall -threaded -O0
Run Code Online (Sandbox Code Playgroud)

它不再构建.我得到了一大堆警告,然后是一大堆未定义的引用,如下所示:

Linking dist/build/personal-website/personal-website ...
/usr/lib/ghc-7.0.3/libHSrts_thr.a(Linker.thr_o): In function
`internal_dlopen':
Linker.c:(.text+0x407): warning: Using 'dlopen' in statically linked
applications requires at runtime the shared libraries from the glibc
version used for linking
/usr/lib/ghc-7.0.3/unix-2.4.2.0/libHSunix-2.4.2.0.a(HsUnix.o): In
function `__hsunix_getpwent':
HsUnix.c:(.text+0xa1): warning: Using 'getpwent' in statically linked
applications requires at runtime the shared libraries from the glibc
version used for linking
/usr/lib/ghc-7.0.3/unix-2.4.2.0/libHSunix-2.4.2.0.a(HsUnix.o): In
function `__hsunix_getpwnam_r':
HsUnix.c:(.text+0xb1): warning: Using 'getpwnam_r' in …
Run Code Online (Sandbox Code Playgroud)

linux haskell heroku static-linking yesod

27
推荐指数
2
解决办法
3万
查看次数

找不到PDB'vc100.pdb'

我已经下载了FreeImage源代码,并为X64 MT DLL自行完成了静态构建.

一切正常,除非我在freeimage.lib文件中使用链接,我得到了很多烦人的链接器警告,我不太明白原因?

2>freeimage.lib(zutil.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'freeimage.lib(zutil.obj)' or at '\bin\Release\vc100.pdb'; linking object as if no debug info
Run Code Online (Sandbox Code Playgroud)

......就像那样......

造成这种情况的原因是什么?如何摆脱它?我在构建FreeImage时猜测它是一些编译器选项.

这是FreeImageLib项目的命令行:

/ I ".. \" /I"..\ZLib "/I"..\DeprecationManager" /I"..\OpenEXR\Half "/I"..\OpenEXR\Iex" /I"..\OpenEXR\IlmImf "/I"..\OpenEXR\Imath" /I"..\OpenEXR\IlmThread "/ NOLOGO/W3/WX-/ OD/d "WIN32"/ d "_DEBUG"/ d "OPJ_STATIC"/ d" FREEIMAGE_LIB"/ D"_CRT_SECURE_NO_DEPRECATE"/ D"LIBRAW_NODLL"/ D"_VC80_UPGRADE = 0x0710"/ D"_MBCS"/ GF-/Gm-/EHsc/RTC1/MDd/GS/fp:precise/Zc:wchar_t/Zc:forScope/OpenMP的/Fp".\Debug/FreeImageLib.pch "/Fa".\Debug/" /Fo".\Debug/ "/Fd".\Debug/"/ GD/errorReport:队列

编辑:

我通过将其构建为动态库来解决它.虽然这不是我希望的解决方案......

c++ linker warnings visual-studio-2010 static-linking

26
推荐指数
1
解决办法
4万
查看次数

如何静态链接.DLL?

我们有一个由VS构建的(纯本机C++).DLL.作为客户端,我们有一些本机C++应用程序和围绕这个用C++/CLI编写的DLL的.Net-Wrapper.最后,有一些用C#编写的.Net-Wrapper客户端应用程序.

我的问题是native.dll必须以与.Net世界不同的方式分发,并且VS不会跟踪该DLL.因此,要让我的所有C#应用程序正常工作,我必须将其复制到每个可执行文件目录中,或者将其放在%PATH%中(我会避免在开发人员计算机上,因为他们可能希望使用不同版本的DLL启动不同的应用程序).如果存在引用Wrapper-DLL的UserControl,则会出现更大的问题:您必须将DLL复制到VS的目录或再次复制到%PATH%.但最坏的情况发生在我们的翻译工具上.该工具跟踪.Net-Assemblies并将它们打包到可以发送给外部翻译器的Translator-packages中.据我所知,没有办法将原生.DLL放入该包中!

所以我打算将原生DLL静态链接到.Net-Wrapper,这将解决我的问题.但对于我们的Native应用程序,此本机DLL仍必须是DLL.

所以我有两个选择:

  • 制作两个项目(一个生成静态库;一个创建动态库=>我尽量避免这种情况)
  • 找到一个静态链接DLL的解决方案
  • 找到一种让VS从一个项目生成两个输出的方法

c++ dll linker static-linking

24
推荐指数
3
解决办法
4万
查看次数

静态链接的可执行文件是否比动态链接的可执行文件更快?

由于动态链接库必须在运行时解析,静态链接的可执行文件是否比动态链接的可执行文件更快?

dll performance linker dynamic-linking static-linking

24
推荐指数
2
解决办法
1万
查看次数

如何强制gcc链接库中未引用的静态C++对象

我正在使用可以构建为共享库或静态库的C++库.该库使用工厂技术,其中静态对象在程序启动时自行注册并创建静态对象.

只要使用共享库,这样就可以正常工作.当使用静态版本时,没有任何静态对象被包含在最终程序中(因为它们没有被直接引用),因此它们的功能不可用.

有没有办法强制gcc在链接时包含库中的所有静态对象?

该库是开源的,我可以修改它,如果这有帮助.

c++ linux gcc static-linking static-initialization

24
推荐指数
1
解决办法
1万
查看次数

创建一个静态Haskell Linux可执行文件

这通常不是我喜欢的两件事,因为这些事情让我非常恼火(除了我的孩子).我在工作中编写了一个Haskell程序,它使用文本,xml-enumerator,attoparsec-text等库.我在工作的Windows机器上正常工作,我的Ubuntu虚拟机在工作(32位),我的Ubuntu桌面(再次32位)和运行Ubuntu(64位)的EC2实例.

我们的客户端运行的是CentOS 5.3,64位.我不能为我的生活让这个可执行文件正常运行.我尝试使用以下方法创建静态可执

ghc --make myprog.hs -optl-static -optl-pthread
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在CentOS服务器上运行该可执行文件时,我收到一条错误消息:

openFile: invalid argument (Invalid argument)
Run Code Online (Sandbox Code Playgroud)

我假设这与此处描述的错误有关.我尝试从32位和64位Ubuntu编译,尝试静态和共享版本,没有任何作用(虽然我偶尔会得到段错误而不是上面的错误消息).我可以尝试下载CentOS 5.3并为它创建一个虚拟机,但下载需要一段时间,而且我不确定哪个版本的GHC可以使用它(我尝试在他们的服务器上安装GHC 7,但我跑了进入libc问题).

在这一点上,我想出了一些可能的方法,但我想尽可能避免这些:

  • 用另一种语言重写(在Java中这样做的想法让我感到不安,尽管这可能是尝试Cal/OpenQuark的好时机).
  • 也许试试一个替代编译器,比如jhc.但是我不太确定如何开始在jhc中安装该程序的所有依赖项; 如果人们有经验并且知道jhc中的text/attoparsec/etc工作,我很乐意听到它.
  • 所有黑客攻击:构建Windows可执行文件,在其服务器上安装wine并以这种方式运行.

总而言之,这些是我真的希望我们有GHC的JVM后端的情况.我想我也可以试用LambdaVM.但我很想听听社区对这里做什么的建议.

linux haskell ld static-linking libraries

24
推荐指数
3
解决办法
8679
查看次数