CMake:使用需要静态库的动态库来构建exe

时间:2014-11-08 04:19:57

标签: cmake clion

我下载了一个框架并决定将其捆绑为.so以包含在我的其他项目中。该框架确实依赖于一些静态库。我在多个帖子中看到你无法将静态库链接到.so,因为并非所有链接器都支持这个。

所以我尝试将静态库链接到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'

2 个答案:

答案 0 :(得分:1)

将共享对象链接到静态库很好,只要您自己构建所有内容就不会有任何问题。从某个地方导入静态库可能会给你带来一些痛苦。

通常,静态库是自包含的,并且具有要执行的所有相关代码。这意味着一些低级标准库内容通常包含在.a中。如果您有多个来自不同平台/编译器的.a,那么在链接期间可能会出现符号冲突/不匹配。

您尝试执行的操作无效,因为libframework3.so会尝试自行链接,而不是使用renderer.exe代码来解析符号。然后它将找不到你的.lib并失败

另一种解决方案可能是将静态库重新编译为共享对象,而是使用它们。

答案 1 :(得分:1)

使用 target_link_libraries 时,似乎静态库未与exe正确链接。 我将 add_library IMPORTED 属性一起使用:

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

希望它有所帮助...