我可以安装库的共享.so和静态.a版本吗?

时间:2013-03-26 15:26:19

标签: linux linker shared-libraries static-libraries libraries

我的问题与此有关:Creating both static and shared C++ libraries

我正在编译一个库,以便在两个不同的系统上将它安装在〜/ local中。似乎每次我这样做,我最终都会遇到链接器问题,需要花费数小时才能弄明白。我正在查看的特定库是primesieve。在该库中,它是仅构建静态库的默认值。遗憾的是,无论出于何种原因,示例代码count_primes.cpp都不会与我的某个系统上的库的静态版本链接。最终我想出了如何构建共享版本,现在代码编译得很好,没有必要的丑陋黑客。

鉴于上述情况,如果您正在使用多个系统并希望最好的机会编译代码,那么编译静态和共享版本似乎是一个好主意。这是真的?有没有理由不建立这两个版本?我意识到这是一个主观问题,但这是一个严重的编程问题,我认为很多人可能会遇到这个问题。

<小时/> PS。

这是我最终用来编译和安装primesieve的共享和静态版本到〜/ local:

make
make lib
make install PREFIX=~/local
make clean
make lib SHARED=yes
make install PREFIX=~/local

make cleanbecause of this。然后我将其添加到我的.bash_profile

export LIBRARY_PATH=$LIBRARY_PATH:~/local/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/local/lib
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:~/local/include

或者,在不更改环境变量的情况下,我能够像这样编译示例程序count_primes.cpp

g++ -I ~/local/include/ -L ~/local/lib/ -lprimesieve count_primes.cpp

2 个答案:

答案 0 :(得分:2)

要使用静态库,您只需将其包含在编译中,就像它是常规对象文件一样,例如

g++ -o foo foo.cpp /path/to/mylib.a

当然,这也意味着静态链接。

您仍然可以静态链接动态库,因此静态库的用处并不多。

答案 1 :(得分:1)

没有理由不建两者。两个图书馆都不会“做”任何事情。只有在可用于动态链接器的路径中时才会加载共享库(就像通过将其添加到LD库路径中一样)。除非你明确地链接它,否则不会使用静态的 - 但这只能在编译(链接)时完成。

相关问题