2014-11-08 85 views
0

我下載了一個框架並決定將它捆綁爲一個.so文件以包含在我的其他項目中。但是框架依賴於一些靜態庫。我在多篇文章中看到,您無法將靜態庫鏈接到.so,因爲並非所有鏈接程序都支持這一點。CMake:使用需要靜態庫的動態庫構建exe文件

因此,我試圖鏈接靜態庫到exe文件,並鏈接.so。我得到的錯誤說引用是未定義的(引用靜態庫中的東西)。

例如:

add_library(framework3 SHARED ${MY_SOURCES}) #produces libframework3.so 

然後在EXE項目:

add_executable(renderer.exe ${MY_SOURCES}) 
target_link_libraries(tsx_renderer.exe framework3) 
target_link_libraries (renderer.exe ${PROJECT_SOURCE_DIR}/Framework/Libs/libjpeg.lib) 
target_link_libraries (renderer.exe ${PROJECT_SOURCE_DIR}/Framework/Libs/libpng.lib) 

該錯誤消息我得到的是:

/home/joe/ClionProjects/proj/build/libframework3.so: undefined reference to `jpeg_destroy_compress' 
/home/joe/ClionProjects/proj/build/libframework3.so: undefined reference to `png_set_write_fn' 

回答

1

似乎在使用target_link_libraries時,靜態庫與exe無法正確鏈接。 我用add_libraryIMPORTED屬性,而不是:

add_library(TheStaticLibrary STATIC IMPORTED) 
set_property(TARGET TheStaticLibrary PROPERTY IMPORTED_LOCATION "THE_LIBRARY_PATH") 

希望它可以幫助...

+0

事實上這是問題,我能夠用「Z」短名稱包括的lib同樣,這讓我有點失落。 – Joe 2014-11-18 17:39:12

1

鏈接共享對象的靜態庫是罰款,並應只要你自己建立一切,沒有任何問題。從某處導入靜態庫可能會帶來一些麻煩。

通常靜態庫是自包含的,並具有所有相關的代碼來執行。這意味着一些低級標準庫的東西通常包含在.a中。如果您有多個.a來自不同的平臺/編譯器,那麼在鏈接期間可能會出現符號衝突/不匹配。

您正在嘗試執行的操作不起作用,因爲libframework3.so會嘗試自行鏈接,而不是使用renderer.exe代碼來解析符號。然後它不會找到你的.lib文件並失敗

另一種解決方案是將靜態庫重新編譯爲共享對象,然後使用它們。