我的問題與此相關: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 clean
是because 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
非常酷 - 我不知道你可以用'.a'文件做到這一點。 – 2013-03-26 16:00:27
這就是*僅*使用靜態庫。他們在那裏靜態地鏈接一個可執行文件。它們不像動態*那樣被使用,就像共享庫(即在運行時)。 – Brad 2013-03-26 16:17:15
我的意思是我沒有意識到-lfoo可以被一個顯式路徑替換爲一個靜態庫。 – 2013-03-26 17:32:36