1

我的问题与此有关:创建静态和共享 C++ 库

我正在编译一个库,以便将它安装在两个不同系统上的 ~/local 中。似乎每次我这样做时都会遇到链接器问题,这需要我几个小时才能弄清楚。我正在查看的特定库是primesieve。在该库中,默认情况下仅构建静态库。不幸的是count_primes.cpp,无论出于何种原因,示例代码都不会与我的一个系统上的库的静态版本链接。最终我想出了如何构建共享版本,现在代码编译得很好,不需要丑陋的 hack。

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


PS。

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

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

make clean就是因为这个。然后我将此添加到我的.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
4

2 回答 2

2

要使用静态库,您可以将其包含在编译中,就好像它是常规目标文件一样,例如

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

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

您仍然可以与动态库进行静态链接,因此静态库实际上并没有多大用处。

于 2013-03-26T15:43:19.563 回答
1

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

于 2013-03-26T15:30:11.987 回答