2013-03-26 22 views
1

我的問題與此相關:Creating both static and shared C++ libraries我可以安裝庫的共享.so和靜態.a版本嗎?

我正在編譯一個庫,以便將它安裝在兩個不同系統上的〜/ local中。似乎每次我這樣做時,最終都會遇到鏈接器問題,需要我花幾個小時才能弄清楚。我正在看的具體圖書館是primesieve。在該庫中,僅默認構建靜態庫。不幸的是,示例代碼count_primes.cpp不會與我的某個系統上的庫的靜態版本鏈接,無論出於何種原因。最終我想出瞭如何構建共享版本,並且現在編譯的代碼很好,並且不需要難看的黑客。

鑑於上述情況,似乎編譯靜態和共享版本是一個好主意,如果您正在使用多個系統並希望有最佳機會進行代碼編譯。這是真的?是否有理由不構建兩個版本?我意識到這是一個主觀的問題,但這是一個嚴重的編程問題,我認爲很多人可能遇到過。


PS。

這是我最終使用的編譯和安裝primesieve的共享和靜態版本到〜/地方:

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

要使用靜態庫,只需將其包含在編譯中就好像它是一個常規目標文件,例如,

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

當然,這也意味着靜態鏈接。

你仍然可以靜態鏈接一個動態庫,所以真的沒有太多的用途。

+0

非常酷 - 我不知道你可以用'.a'文件做到這一點。 – 2013-03-26 16:00:27

+0

這就是*僅*使用靜態庫。他們在那裏靜態地鏈接一個可執行文件。它們不像動態*那樣被使用,就像共享庫(即在運行時)。 – Brad 2013-03-26 16:17:15

+0

我的意思是我沒有意識到-lfoo可以被一個顯式路徑替換爲一個靜態庫。 – 2013-03-26 17:32:36

1

沒有理由不建兩個。圖書館都不會「做」任何事情。只有當共享庫位於動態鏈接程序可用的路徑中時纔會加載共享庫(與將其添加到LD庫路徑中一樣)。靜態的不會被使用,除非你明確地鏈接它 - 但這隻在編譯(鏈接)時完成。

+0

你是什麼意思「兩個圖書館都不會做'任何事情。」? – 2013-03-26 15:59:38